今天学习了一下shiro,也不是太懂,这里给大家分享一下认证过程吧,如果本人有什么不对的地方也请各位帮我指正一下
首先我们在pom.xml里面加入shiro的jar依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.2.3</version>
</dependency>
然后我们在resource目录下新建一个ini文件为shiro.ini,在文件内放入我们的测试数据 :
[users]
#模拟数据库用户列表:账号=密码
zhangsan=666
lisi=888
然后我们在test目录下面新建一个shiro.class测试类
import org.apache.shiro.SecurityUtils;
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;
/*
测试shiro认证
*/
public class Shiro {
@Test
public void testLogin() throws Exception{
//1.创建security Manager工厂对象:加载配置文件,创建工厂对象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2.通过工厂对象,创建Security Manager
SecurityManager securityManager = factory.getInstance();
//3.将securitManager绑定到当前运行环境中:让系统随时都可以访问securityManager对象
SecurityUtils.setSecurityManager(securityManager);
//4.创建当前登陆主体
Subject subject = SecurityUtils.getSubject();
//5.绑定主体登陆的身份/凭证,即账号密码
//参数1.将要登陆的用户名,参数2.登陆用户密码
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","666");
//6.主体登陆
try{
subject.login(token);
}catch (Exception e) {
//登陆失败
}
//7.判断登陆是否成功
System.out.println("验证登陆是否成功:"+subject.isAuthenticated());
//8.登出
subject.logout();
System.out.println("验证登陆是否成功:"+subject.isAuthenticated());
}
}
我们执行后会得到如下结果
这里显示我们登录成功,我们在登录时使用debug可以发现shiro的一个认证过程为:
- 调用subject.login方法进行登陆,其会自动委托给securityManager.login方法进行登录;
- SecurityManager通过Authenticator(认证器)进行认证
- Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号密码,这里使用的是IniRealm(shiro自带,相当于数据源)
- IniRealm先根据token中的账号去ini中找该账号,如果找不到则给Modular Realm Authenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过;
- 最后调用Subject.Logout进行退出操作;
如果我们使用图像来表示就是:
我个人的理解就是:当我们页面上传过来账号和密码时,使用UsernamePasswordToken把我们的账号密码封装成一个token对象
到subject类,注意:这里的subject类不是我们Java.lang包下面的subject而是shiro.subject包下面的;当执行登录操作的时候subject的login方法会委托到SecurityManager的login方法,在这时我们shiro.ini文件中的数据会生成一个realm对象给SecurityManager,然后SecurityManager委托authenticator帮我们验证页面传过来的账号密码是否和我们数据库(shiro.ini)的数据对应,如果对应,那我们就登录成功,否则失败。