Shiro 二 shiro登录、登出流程分析

接着上一篇来说,我直接把上一篇的代码复制过来

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 进行退出操作。

发布了123 篇原创文章 · 获赞 29 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/m0_38044453/article/details/89677343