Shiro令牌认证源码解析

用来测试的实例代码

package com.baizhi.test;

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.junit.Test;


public class ShiroTestDemo {
    /**
     * 模拟用户输入的用户名和密码
     */
    private String username = "zhangsan";
    private String password = "123456";

    @Test
    public void test1() {
        //1、获取配置文件中的数据,得到安全管理器工厂
        IniSecurityManagerFactory securityManagerFactory = new IniSecurityManagerFactory("classpath:static/shiro.ini");
        //2、获取安全管理器,安全管理器封装了配置文件数据【相当于得到数据库中所有的数据】
        SecurityManager securityManager = securityManagerFactory.getInstance();
        //把安全管理器给工具类 相当于Subject和安全管理器建立了联系
        SecurityUtils.setSecurityManager(securityManager);
        //3、获取Subject【通过工具类获取】->保证了在项目的任何位置获取到的对象都是同一个
        Subject subject = SecurityUtils.getSubject();
        //4、把用户输入的账号和密码给Subject对象   调用登录方法传入用户输入的账号密码[封装到token中]
        //封装到令牌
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        /**
         * login通过抛异常的方式 告诉用户有没有认证成功
         * UnknownAccountException 不知道账号异常 账号错误
         * IncorrectCredentialsException 不正确的密码 密码错误
         */
        try {
            subject.login(token);
            System.out.println("登录成功");
        } catch (Exception e) {
            System.out.println("账号或密码错误");
        }
        /**
         * isAuthenticated 查询当前主体的认证状态
         * Authenticate 认证
         */
        boolean authenticated = subject.isAuthenticated();
        System.out.println(authenticated);
    }
}

模拟数据库

shiro.ini文件

[users]
zhangsan=123456
lisi=123456
lilei=123456
lihua=123456
hanmm=123456

打断点的位置

说明:因为要追踪身份令牌token的运行流程,这里在提交token的位置打断点

Debug模式运行

变量

变量区说明

调用安全管理器中login方法

调用安全管理器中的方法

认证方法

认证token方法

调用认证器里面的认证方法

调用认证器里面的认证方法

做认证

做认证

Realm对象查询数据

Realm对象查询对应token中的所有数据

获取认证信息

获取认证信息
获取认证数据
认证信息

异常情况

如果accountnull,则说明token为空,那么doGetAuthenticationInfo(token)获取到的认证数据也为null,返回的验证信息infonull,根据源码,如果info==null,抛出异常throw new UnknownAccountException(msg).

结论

SimpleAccountRealm类中默认实现了抽象类AuthenticatingRealm中的用来获取认证信息的方法,默认是从配置文件中获取认证信息,所以如果想要改变获取认证信息的方法的话,可以自定义一个Realm继承AuthenticatingRealm抽象方法,实现获取认证信息的方法,声明在shiro中使用自定义的Realm

自定义Realm后续~~~~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值