Shiro 认证

前言

这一章我们来学习Shiro的认证。接下来看一下什么是Shiro认证

认证

简单说认证是核实用户身份的过程。也就是说,当用户使用应用进行认证时,他们就在证明他们就是自己所说的那个人。有时这也理解为“登录”。它是一个典型的三步骤过程。

  1. 收集用户的身份信息,称为当事人(principal),以及身份的支持证明,称为证书(Credential)。
  2. 将当事人和证书提交给系统。
  3. 如果提交的证书与系统期望的该用户身份(当事人)匹配,该用户就被认为是经过认证的,反之则被认为未经认证的。

这个过程的常见例子是大家都熟悉的“用户 / 密码”组合。多数用户在登录软件系统时,通常提供自己的用户名(当事人)和支持他们的密码(证书)。如果存储在系统中的密码(或密码表示)与用户提供的匹配,他们就被认为通过认证。

身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡.
在这里插入图片描述
在这里插入图片描述

上图展示了 Shiro 认证的一个重要的过程,为了加深我们的印象,我们来自己动手来写一个例子,来验证一下,首先我们新建一个Maven工程,然后在pom.xml中引入相关依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.4.0</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

新建一个【AuthenticationTest】测试类:

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;

public class AuthenticationTest {

    SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();

    @Before // 在方法开始前添加一个用户
    public void addUser() {
        simpleAccountRealm.addAccount("wangwu", "123456");
    }

    @Test
    public void testAuthentication() {
		//1、创建SecurityManager工厂,IniSecurityManagerFactory可以从ini文件中初始化SecurityManager环境
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //2、,创建Security通过工厂对象Manger对象
        SecurityManager securityManager = factory.getInstance();
        //3、将securityManager设置到运行环境中,让系统随时随地访问securityManager
        SecurityUtils.setSecurityManager(securityManager);
        //4、创建当前登录主体
        Subject subject = SecurityUtils.getSubject();
        //5、收集主体登录的身份/凭证,即账号密码
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","666");
        //6、主体登录
        subject.login(token);
        //7、判断登录是否成功
        System.out.println("验证登录是否成功:"+subject.isAuthenticated());
        //8、登出(注销)
        subject.logout();
        System.out.println("验证登录是否成功:"+subject.isAuthenticated());
    }
}

创建ini 文件

[users]
zhangsan=666
lisi=888

运行之后可以看到预想中的效果,先输出 第一个 验证登录是否成功:true 表示登录认证成功,然后再输出 第二个 验证登录是否成功:flase表示认证失败退出登录,再来一张图加深一下印象:
在这里插入图片描述

流程如下:

  1. 首先调用 Subject.login(token) 进行登录,其会自动委托给 Security Manager,调用之前必须通过 SecurityUtils.setSecurityManager() 设置;
  2. SecurityManager 负责真正的身份验证逻辑;它会委托给 Authenticator 进行身份验证;
  3. Authenticator 才是真正的身份验证者,Shiro API 中核心的身份认证入口点,此处可以自定义插入自己的实现;
  4. Authenticator 可能会委托给相应的 AuthenticationStrategy 进行多 Realm 身份验证,默认 ModularRealmAuthenticator 会调用 AuthenticationStrategy 进行多 Realm 身份验证;
  5. Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,如果没有返回 / 抛出异常表示身份验证失败了。此处可以配置多个 Realm,将按照相应的顺序及策略进行访问。
    在这里插入图片描述
认证常见的异常

在这里插入图片描述


Shiro源码研究之登录与登出

这里我就不给大家细细截图讲解了,推荐一篇博客大家自行看看:

自定义Realm实现认证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值