shiro认证的工作原理

   今天学习了一下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的一个认证过程为:

  1. 调用subject.login方法进行登陆,其会自动委托给securityManager.login方法进行登录;
  2. SecurityManager通过Authenticator(认证器)进行认证
  3. Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号密码,这里使用的是IniRealm(shiro自带,相当于数据源)
  4. IniRealm先根据token中的账号去ini中找该账号,如果找不到则给Modular Realm Authenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过;
  5. 最后调用Subject.Logout进行退出操作;

如果我们使用图像来表示就是:

我个人的理解就是:当我们页面上传过来账号和密码时,使用UsernamePasswordToken把我们的账号密码封装成一个token对象

到subject类,注意:这里的subject类不是我们Java.lang包下面的subject而是shiro.subject包下面的;当执行登录操作的时候subject的login方法会委托到SecurityManager的login方法,在这时我们shiro.ini文件中的数据会生成一个realm对象给SecurityManager,然后SecurityManager委托authenticator帮我们验证页面传过来的账号密码是否和我们数据库(shiro.ini)的数据对应,如果对应,那我们就登录成功,否则失败。

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值