您的位置:首页 > 其它

Shiro使用指南(二)

2015-11-27 14:23 399 查看

1、准备工作

为了测试教程,我们先准备好以下工具。

Eclipse
Apache Maven2.2.1 或 更高的版本

java 1.5 或 更高的版本
本人的系统是windows 7, 在Dos输入mvn -version来测试mvn是否安装,并且已配置到环境变量。如图:



如你所见,windows 7系统, Java 1.7, Apache Maven 3.2.1。

2、在Eclipse建立一个Maven项目,并配置pom.xml文件

在Eclipse建立Maven项目就不详解了,项目结果如下:



Tutorial.java文件的内容如下:

package com.dsc;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Tutorial {
private static final transient Logger log = LoggerFactory.getLogger(Tutorial.class);

public static void main(String[] args) {
log.info("我的第一个Apache Shiro应用程序");
System.exit(0);
}
}


pom.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>org.apache.shiro.tutorials</groupId>
<artifactId>shiro-tutorial</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>First Apache Shiro Application</name>
<packaging>jar</packaging>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<!-- shiro核心类库 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.1.0</version>
</dependency>
<!-- Shiro使用SLF4J来记录日志. 去http://www.slf4j.org查看更多的信息. -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<!-- compiler插件, 设定JDK版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>

<!-- This plugin is only to test run our little application.  It is not
needed in most Shiro-enabled applications: -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.2</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<classpathScope>test</classpathScope>
<mainClass>com.dsc.Tutorial</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>


在Shiro-tutorial项目执行 compile exec:java。如下图:



在Console输出:

[INFO] Scanning for projects...
......
[WARNING] Warning: killAfter is now deprecated. Do you need it ? Please comment on MEXEC-6.
<span style="color:#FF0000;">0 [com.dsc.Tutorial.main()] INFO com.dsc.Tutorial - 我的第一个Apache Shiro应用程序</span>
从控制台输出的结果看来,我们的应用程序成功运行。接下来我们往应用程序加入更多的代码。

Shiro的介绍(一)了解,Shiro提供了一个默认“公共性”的基于文本的INI配置的解决方案。和XML文件相比,INI文件易于阅读,易于使用,并且只需要很少的依赖。因此,我们在这个简单的应用程序使用INI文件来配置Shiro SecurityManager。

在src/main/resources中建立Shiro.ini文件。文件内容如下:

# -----------------------------------------------------------------------------
# 用户名 = 密码, 角色1, ..., 角色N
# username = password, role1, role2, ..., roleN
# -----------------------------------------------------------------------------
[users]
root = secret, admin
jack = 123456, manager, employees

# -----------------------------------------------------------------------------
# 角色 = 权限1, ..., 权限N
# roleName = perm1, perm2, ..., permN
# -----------------------------------------------------------------------------
[roles]
admin = *
manager = custom:*
employees = order:list:create
接着我们修改Tutorial.java的内容:

package com.dsc;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Tutorial {

    private static final transient Logger log = LoggerFactory.getLogger(Tutorial.class);

public static void main(String[] args) {
log.info("我的第一个Apache Shiro应用程序");
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);

Subject currentUser = SecurityUtils.getSubject();

Session session = currentUser.getSession();
session.setAttribute("someKey", "aValue");
String value = (String)session.getAttribute("someKey");
if ("aValue".equals(value)) {
log.info("session获取正确的值[" + value + "]!");
}

if (!currentUser.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken("jack", "123456");
token.setRememberMe(false);

try {
currentUser.login(token);
} catch (UnknownAccountException uae ) {
log.info("[" + token.getPrincipal()+"]账号不存在");
return ;
} catch (IncorrectCredentialsException ice ) {
log.info("[" + token.getPrincipal() + "]账号的密码不是" + token.getCredentials());
return ;
} catch (LockedAccountException lae ) {
log.info("[" + token.getPrincipal()+"]账号已经被锁定");
return ;
} catch (AuthenticationException ae ) {
log.info("账号/密码错误");

4000
return ;
}
}

log.info("[" + currentUser.getPrincipal() + "]账号登录成功");

if (currentUser.hasRole("manager")) {
log.info("系统账号拥有角色[manager]");
} else {
log.info("系统账号没有角色[manager]");
}

if (currentUser.isPermitted("custom:weild")) {
log.info("系统账号拥有权限[custom]");
} else {
log.info("系统账号没有权限[custom]");
}

if (currentUser.isPermitted("order:list:create")) {
log.info("系统账号拥有权限[employees]");
} else {
log.info("系统账号没有权限[employees]");
}

// 登出
currentUser.logout();

System.exit(0);
}
}
再次执行 compile exec:java,则Console输出:

[INFO] Scanning for projects...
...
0 [com.dsc.Tutorial.main()] INFO com.dsc.Tutorial - 我的第一个Apache Shiro应用程序
73 [com.dsc.Tutorial.main()] INFO org.apache.shiro.session.mgt.AbstractValidatingSessionManager - Enabling session validation scheduler...
109 [com.dsc.Tutorial.main()] INFO com.dsc.Tutorial - session获取正确的值[aValue]!
110 [com.dsc.Tutorial.main()] INFO com.dsc.Tutorial - [jack]账号登录成功
110 [com.dsc.Tutorial.main()] INFO com.dsc.Tutorial - 系统账号拥有角色[manager]
110 [com.dsc.Tutorial.main()] INFO com.dsc.Tutorial - 系统账号拥有权限[custom]
110 [com.dsc.Tutorial.main()] INFO com.dsc.Tutorial - 系统账号拥有权限[employees]


如你所见,应用程序执行很成功。从shiro.ini文件来看,结果一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: