环境Maven+eclipse
maven依赖的jar包:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
在src/main/resource中添加shiro.ini配置文件内容如下:
[users]
zhang=123,role1,role2
[roles]
role1 = p1,p2
role2 =
测试测试:
@Test
public void test() {
// 1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:shiro.ini");
// 2、得到SecurityManager实例 并绑定给SecurityUtils
org.apache.shiro.mgt.SecurityManager securityManager = factory
.getInstance();
SecurityUtils.setSecurityManager(securityManager);
// 3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
// 4、登录,即身份验证
subject.login(token);
Assert.assertEquals(true, subject.isAuthenticated()); // 断言用户已经登录
Assert.assertEquals(true, subject.isPermitted("p1")); // 断言用户所对应的资源
// 6、退出
subject.logout();
}
shiro.ini是一种配置文件方式,INI基本上是一个文本配置,包含了由唯一命名的项来组织的键/值对,键只是每个项唯一,而不是在整个配置中(与JDK 属性不同)。由于兼容JavaBean模式,并且Shiro的SecurityManager实现了所有支持的组件都是兼容JavaBean的,所以配置它的方式有很多种。上面是最简单的一种.
shiro进行身份校验已经受援的流程:
Realm就是数据源,最终在Realm中进行身份验证和凭证信息,执行过程:
1、通过ini配置文件创建securityManager
2、调用subject.login方法主体提交认证,提交的token
3、securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。
4、ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息
5、IniRealm根据输入的token(UsernamePasswordToken)从shiro-first.ini查询用户信息,根据账号查询用户信息(账号和密码)
如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)
如果查询不到,就给ModularRealmAuthenticator返回null
6、ModularRealmAuthenticator接收IniRealm返回Authentication认证信息
如果返回的认证信息是null,ModularRealmAuthenticator抛出异常(org.apache.shiro.authc.UnknownAccountException)
如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码 (在ini文件中存在)和 token中的密码 进行对比,如果不一致抛出异常(org.apache.shiro.authc.IncorrectCredentialsException)