1.认证流程图
2.创建项目
2.1 创建maven中的quickstart项目
2.2 导入pom依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</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>
2.3 创建测试
2.3.1 测试代码
@Test
public void testLogin() throws Exception{
//1.构建或者创建出SecurityManager工厂对象,加载配置文件
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2.通过工厂对象,创建SecurityManager对象
SecurityManager securityManager = factory.getInstance();
//3.将我们SecurityManager绑定到当前运行环境中,让系统随时随地访问SecruityManager对象
SecurityUtils.setSecurityManager(securityManager);
//4.创建当前登录的主体 此时的主体没有经过认证 是一个空
Subject subject = SecurityUtils.getSubject();
//5.收集主体登录的身份与凭证(账号与密码 )
UsernamePasswordToken token = new UsernamePasswordToken("zhangsans", "666");
//6.主体登录
subject.login(token);
//7.判断登录是否成功
System.out.println("验证登录是否成功:"+subject.isAuthenticated());
//8.登出 注销
subject.logout();
System.out.println("验证登录是否成功:"+subject.isAuthenticated());
}
2.3.1 测试的ini文件
在resources目录下创建.ini文件,下面是内容:
[users]
#模拟数据库用户列表 账号=密码
zhangsan=666
lisi=888
2.3.1 测试结果(三种不同情况的结果)
- 正常结果:
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
验证登录是否成功:true
验证登录是否成功:false
- 用户名不存在
抛出:org.apache.shiro.authc.
UnknownAccountException
: Realm [org.apache.shiro.realm.text.IniRealm@44e81672] was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - zhangsanw, rememberMe=false].
- 密码错误
抛出:org.apache.shiro.authc.
IncorrectCredentialsException
: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - zhangsan, rememberMe=false] did not match the expected credentials.
2.3.1 认证分析
1. 调用subject.login(token)方法进行登录,其会自动委托给securityManager.login(subject,token)方法进行登录。
2. securityManager通过Authenticator(认证器)进行认证。
3. Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件中读取真实的用户名跟密码,这里使用的是IniRealm(shiro自带,相当于数据源)。
4. IniRealm先根据token中的账号去ini中去找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,密码匹配通过则认证通过,反之亦然。
5. 最后调用Subject.logout进行退出操作。