1、导入jar包
2、创建shiro-first.ini文件
[users]
zhangsan=111111
lisi=22222
3、创建AuthenticationTest测试类
public class AuthenticationTest {
// 用户登陆和退出
@Test
public void testLoginAndLogout() {
// 创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:shiro-first.ini");
// 创建SecurityManager
SecurityManager securityManager = factory.getInstance();
// 将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 从SecurityUtils里边创建一个subject
Subject subject = SecurityUtils.getSubject();
// 在认证提交前准备token(令牌)
// 这里的账号和密码 将来是由用户输入进去
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
"111111");
try {
// 执行认证提交
subject.login(token);
} catch (AuthenticationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 是否认证通过
boolean isAuthenticated = subject.isAuthenticated();
System.out.println("是否认证通过:" + isAuthenticated);
// 退出操作
subject.logout();
// 是否认证通过
isAuthenticated = subject.isAuthenticated();
System.out.println("是否认证通过:" + isAuthenticated);
}
}
4、进行Junit Test
获得结果
执行流程
- 通过ini配置文件创建securityManager。
- 调用subject.login方法提交认证。
内部通过securityManager进行认证,securityManager通过authenticated最终由ModularRealmAuthenticator进行认证。 ModularRealmAuthenticator拿着输入的token(UsernamePasswordToken)和shiro-first.ini中的配置的用户名和密码进行对比,IniRealm负责从shiro-first.ini中查询用户信息(账号和密码)
iniRealm查询账号时找不到给ModularRealmAuthenticator返回null(说明账号不存在)
账号不存在则抛出异常:
org.apache.shiro.authc.UnknownAccountException: Realm [org.apache.shiro.realm.text.IniRealm@6a9dd62a] was unable to find account data。。。如果上一步查询到用户
ModularRealmAuthenticator进行密码匹配,如果不对,ModularRealmAuthenticator抛出异常:
org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - zhangsan, rememberMe=false] did not match the expected credentials.