2021年你还不会Shiro?----2.Shiro实现登录功能(身份认证实践)

简介: 上一篇介绍了Shiro的架构,我们可以发现Shiro核心的东西并不多,我们花个几分钟就可以把Shiro的机构记清楚,其中Security Manager就是Shiro的核心,他包含了身份认证器Authenticator、授权器Authorizer、Session管理Session Manager、缓存管理Cache Manager。这一篇我们就介绍下Shiro的身份认证的过程,也就是我们说的用户登录。

前言



上一篇介绍了Shiro的架构,我们可以发现Shiro核心的东西并不多,我们花个几分钟就可以把Shiro的机构记清楚,其中Security Manager就是Shiro的核心,他包含了身份认证器Authenticator、授权器Authorizer、Session管理Session Manager、缓存管理Cache Manager。这一篇我们就介绍下Shiro的身份认证的过程,也就是我们说的用户登录。


使用Shiro进行身份认证



1.什么是身份认证?


身份认证就是根据用户输入的用户名密码对数据库中存储的用户信息进行比对,一致则认证成功,否则失败,Shiro的配置文件是.ini结尾的文件用以存储用户信息,权限信息等,注意该文件只是用于测试场景,真正开发中是不会使用该文件的,在实际项目中这些信息都是数据库存储,不会再配置文件写死。


2.身份认证必须要知道的对象


我们已经知道,身份认证要依赖Subject(主体)来完成,主体中携带的是用户的信息与密码。所以对于这两部分我们也是要了解的。


1.Principal /ˈprɪnsəpl/ :主要因素,这里指的是登录的用户信息,也就是要用户名,一个主体可以有多个principal,比如用户名、手机号、邮箱等,但是必须有一个是2.Primary Principal。

credential /krəˈdenʃl/ :证书,这里指的是口令,也就是登录的密码。


3.认证的流程


20210313194256833.png


如上图所示,Subject拿到用户信息与口令,将这些信息打包成一个令牌Token,将令牌信息再交给Security Manager中的Authenticator,对其进行身份验证,然后就会进入到系统中。


二.使用Shiro实现登录功能



1.Shiro所依赖的jar包


我们这里只需要导入其核心包,在pom文件中添加以下依赖,版本自己选择,1系列的版本差距不是很大,这里演示使用1.5.3版本。


<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-core</artifactId>
  <version>1.5.3</version>
 </dependency>


2.创建一个maven工程


第一步建立工程我们使用快速开始的选项创建工程,如下:


20210313195059870.png


第二步,在项目的根目录下创建resources文件用于存放.ini文件,同时创建shiro.ini的Shiro的配置文件。注意文件名无所谓,没有强制的命名规则。


20210313195346759.png


第三步:书写配置文件,在配置文件中加入以下信息,第一行代表下面配置的是用户与密码的键值对。


[users]
zhaoyun=daye
huangzhong=sheshou


第四步:在pom.xml文件中加入上方的依赖,如下图

20210313195645258.png


到这里为止,我们需要的配置都已经齐全,下面就可以写代码了。

第五步:写代码,代码展示如下:


public class TestAuthenticator {
    public static void main(String[] args) {
        //第一步,获取Security Manager
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        //第二步,使用Security Manager加载配置文件,注意前面已经说过Realm是身份认证与权限的数据获取的地方,所以调用setRealm
        defaultSecurityManager.setRealm(new IniRealm("classpath:shiro.ini"));
        //第三步,使用SecurityUtils获取Subject
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();
        //第四步,获取用户登录Token
        UsernamePasswordToken authenticationToken = new UsernamePasswordToken("zhaoyun","daye");
        try {
            System.out.println(subject.isAuthenticated());
            //第五步,登录
            subject.login(authenticationToken);
            System.out.println(subject.isAuthenticated());
        } catch (UnknownAccountException e) {
            e.printStackTrace();
        }catch(IncorrectCredentialsException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}


上方代码的输出结果如下:


false
true
Process finished with exit code 0


3.代码实现解读


代码中已经划分好了每一步,值得说的是第一步中我们使用的是DefaultSecurityManager,而不是SecurityManager,DefaultSecurityManager是他的实现类,所以这里使用DefaultSecurityManager第五步的登录,该方法是没有返回值得,判定登录成功与否有两种方法,第一种就是判断程序有没有异常出现,当用户名异常时程序会报:UnknownAccountException,当用户输入的密码有误时会报:IncorrectCredentialsException。第二种我们可以调用isAuthenticated方法,该方法返回一个boolean的值,true表示验证通过,我们可以看到,在登录之前返回false,登录后就是true了,这就表示登录成功了。


三.总结



到这里我们就实现了一个简单的登录功能。不过这只是一个demo只包含了登录,在实际的项目中会有比这复杂的多的操作,这篇介绍完了身份验证,下一篇会继续探讨怎么通过自定义Realm来实现用户登录功能。

相关文章
|
3月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
安全 Java API
Shiro 身份认证绕过漏洞 CVE-2022-32532
Apache Shiro 是一个强大且易用的 Java 安全框架,通过它可以执行身份验证、授权、密码和会话管理。使用 Shiro 的易用 API,您可以快速、轻松地保护任何应用程序 —— 从最小的移动应用程序到最大的 WEB 和企业应用程序。
473 0
Shiro 身份认证绕过漏洞 CVE-2022-32532
|
缓存 安全 Apache
2021年你还不会Shiro?----3.分析身份认证源码实现自定义Realm
我们已经知道无论我们是认证还是授权,数据的获取都是来源于Realm,Realm就相当于我们的datasource,在上一篇中我们使用的是用IniRealm来加载我们的配置文件shiro.ini,同时我们也说了ini只是临时解决方案,在实际的开发中是不可能把用户信息和权限信息放在ini文件中的,都是来源于数据库,那么系统提供的IniRealm就不能满足我们的需要了,我们就需要自定义Realm来实现真正的场景,事实上ini文件也只是apache为我们提供学习使用的策略,下面我们就来看下怎么自己定义一个Realm。
130 0
2021年你还不会Shiro?----3.分析身份认证源码实现自定义Realm
|
SQL 数据库 数据安全/隐私保护
Shiro框架学习笔记(二)基于内置ini文件的身份认证
Shiro框架学习笔记(二)基于内置ini文件的身份认证
Shiro框架学习笔记(二)基于内置ini文件的身份认证
|
存储 缓存 安全
Apache Shiro身份认证过程详解
Apache Shiro身份认证过程详解
278 0
Apache Shiro身份认证过程详解
|
数据库 数据安全/隐私保护
Shiro身份认证之principals和credentials
Shiro身份认证之principals和credentials
357 0
|
Apache 容器
菜鸟学习shiro之入门的简单登录认证和身份认证1
最近学习了四郎,学的是天南海北,一头雾水,概念懂了,实践呐,就很是缺乏,于是跟着慕课网的视频教程敲敲代码 果然加深了理解,话不多说,直接看代码 Maven的依赖: log4j log4j 1.
1459 0
|
安全 Java 数据安全/隐私保护
Shiro之身份认证、与spring集成(入门级)
目录 1. Shro的概念 2. Shiro的简单身份认证实现 3. Shiro与spring对身份认证的实现   前言:   Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。
1664 0
|
Web App开发 缓存 Java
SpringBoot学习:整合shiro(身份认证和权限认证),使用EhCache缓存
项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)在pom.xml中添加依赖:   [html] view plain copy          1.
3256 0