Shiro认证and认证流程

2023-11-21 15:14:01 浏览数 (1)

什么是认证

也就是身份认证,就是判断一个用户是否为合法用户的处理过程,通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令是否一致,来判断用户的身份是否正确。

关键对象

对面名称

概述

Subject(主体)

用户

Principal(身份信息)

是主体(Subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等

Credential(凭证信息)

是只有主体自己知道的安全信息,如密码、证书等

使用 ini 完成认证

在 Maven 中添加依赖 jar包,修改 pom.xml 依赖如下所示:

代码语言:html复制
<dependencies>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.4.0</version>
    </dependency>

    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

logging 依赖是 Shiro 所依赖的包你尽管添加就行。

resources 下 添加 Shiro.ini 配置文件,首先准备一些用户身份和凭据信息(Shiro.ini)内容如下所示:

代码语言:java复制
[users]
Yby6=1234
Yangbuyi=1234

如上是在 Shiro.ini 中定义了两个用户一个是 Yby6 一个是 Yangbuyi 密码为 1234

登录和退出

如上图的步骤分别为如下所解释的:

  • 构建 SecurityManager 工厂
  • 在通过工厂创建 SecurityManager
  • 在将 SecurityManager 设置到运行环境中
  • 在创建一个 Subject 实例
  • 在创建 Token 令牌
  • 用户登录
  • 用户退出

最终代码如下所示:

代码语言:java复制
/**
 * @author yby6
 */
public class Demo {

    public static void main(String[] args) {
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");

        SecurityManager securityManager = factory.getInstance();

        SecurityUtils.setSecurityManager(securityManager);

        Subject subject = SecurityUtils.getSubject();

        UsernamePasswordToken token = new UsernamePasswordToken("yby6", "1234");

        try {
            subject.login(token);
        } catch (UnknownAccountException e) {
            System.out.println("用户名不存在");
            e.printStackTrace();
        } catch (IncorrectCredentialsException e) {
            System.out.println("密码错误");
            e.printStackTrace();
        }

        System.out.println("是否认证"   subject.isAuthenticated());

        subject.logout();

        System.out.println("是否认证"   subject.isAuthenticated());
    }
}

认证流程图

认证代码执行流程

  1. 调用 subject.login 方法进行登录,其会自动委托给 securityManager.login 方法进行登录。
  1. securityManager 通过 Authenticator(认证器)进行认证。
  1. Authenticator 的实现 ModularRealmAuthenticator 调用 Realm 从 ini 配置文件中取用户真实的账号和密码。
  1. IniRealm 先根据 token 中的账号去 ini 中找该账号,如果找不到则给 ModularRealmAuthenticator 返回 null,如果找到则匹配密码,匹配密码成功则认证通过。
  1. 最后调用 Subject.logout 进行退出操作。

最后

本期结束咱们下次再见

0 人点赞