01-Shiro的入门程序-认证(ssm+Shiro)
一、创建Java Project
jar包:

二、创建ini文件,shiro-first.ini
# 对用户信息进行配置,这个文件相当于数据源、数据库 [users] # 用户名和密码 Peter=111111 Tom=222222
三、创建测试类 AuthenticationTest.java
package cn.itcast.shiro.authentication;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;
// 认证测试
public class AuthenticationTest {
// 登录和退出
@Test
public void testLoginAndLogout() {
// 创建SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-first.ini");
// 获取SecurityManager
SecurityManager securityManager = factory.getInstance();
// 将securityManager设置到运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 创建Subject,这个就是从数据库中获取的正确的主体,包含用户名和凭证(如密码、数字签名、指纹等等)
Subject subject = SecurityUtils.getSubject();
// 创建Token,这个token就是用户输入的用户名和密码做成的token令牌,将来要从数据库中获取
UsernamePasswordToken token = new UsernamePasswordToken("Peter", "111111");
// 认证提交,认证不通过时会报异常
try {
subject.login(token);
} catch (AuthenticationException e) {
e.printStackTrace();
}
// 认证结果:认证通过放回true,失败返回false
boolean isAuthenticated = subject.isAuthenticated();
// 打印认证结果
System.out.println("认证结果:" + isAuthenticated);
// 退出操作
subject.logout();
// 再次打印认证结果
boolean isAuthenticatedAfterLogout = subject.isAuthenticated();
System.out.println("认证结果:" + isAuthenticatedAfterLogout);
}
}
工程结构:

四、运行结果
(1)输入正确的用户名和密码,返回true;
(2)输入错误的用户名,不管密码对不对,都报异常:org.apache.shiro.authc.UnknownAccountException
(3)输入正确的用户名,错误的密码,报异常:org.apache.shiro.authc.IncorrectCredentialsException
(4)如果中间插入logout(),认证结果是false
--------------------------------------------------------------------------------------
认证过程:(追溯shiro源码)
1、创建token令牌,token中有用户提交的认证信息即账号和密码
2、执行subject.login(token),最终由securityManager通过Authenticator进行认证
3、Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带)
4、IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。
--------------------------------------------------------------------------------------
常见的异常:
UnknownAccountException:账号错误
IncorrectCredentialsException:凭证错误
DisabledAccountException:帐号被禁用
LockedAccountException:帐号被锁定
ExcessiveAttemptsException:登录失败次数过多
ExpiredCredentialsException:凭证过期

浙公网安备 33010602011771号