接着上一篇来说,我直接把上一篇的代码复制过来
package com.study.shiro;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
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.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;
public class Test_shiro {
@Test
public void testLogin() throws Exception{
// 1.创建SecurityManager工厂对象,加载配置文件,创建
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
// 2.通过工厂对象,创建Securitymanage对象
SecurityManager securityManager = factory.getInstance();
// 3.将securitymanage绑定到当前运行环境中,让系统随时随地的都可以访问securityManager对象
SecurityUtils.setSecurityManager(securityManager);
// 4:创建当前登录的主体,注意;此时主体没有经过认证
Subject subject = SecurityUtils.getSubject();
// 5:绑定主体登录的身份、凭证,即账号密码
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123");
try {
// 6.主体登录
subject.login(token);
}catch (IncorrectCredentialsException incorrectCredentialsException){
System.out.println("密码错误!");
}catch (UnknownAccountException UnknownAccountException){
System.out.println("用户名错误!");
}
// 7:判断是否登录成功
System.out.println("验证是否登录1:" + subject.isAuthenticated());
// 8:登出
subject.logout();
System.out.println("验证是否登录2:" + subject.isAuthenticated());
}
}
当页面把需要验证的用户名,密码传入到后台后
通过org.apache.shiro.authc.UsernamePasswordToken;生成token;
// 5:绑定主体登录的身份、凭证,即账号密码
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123");
然后调用subject的login方法。
subject.logout();
我采用debug方式走了下。首先是进入logout()方法:
我们继续走,
进入下面的方法,继续走
我们再进入这个doAuthenticate方法看看
最后判断了这个集合的大小等于一的时候进入doSingleReamAuthentication方法,传入集合的第一个realm,和token。
看看传入的realm里面有什么
总的看
1.调用subject.login()方法进行登录,其会自动委托给securityManager.login方法进行登录;
2.security通过Authenticator(认证器)进行认证;
3.Authenticator的实现ModularReamAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是iniRealm(shiro自带,相当于数据源);
4.IniRealm先根据token中的账号去ini中找账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到匹配密码,匹配密码成功则认证通过;
5.最后通用Subject.logout 进行退出操作。