先粘出登录的代码

1.

可以看到已经获取到了username和password ,为了接下来的认证过程,我们需要获取subject对象,也就是代表当前登录用户,并且要将username和password两个变量设置到UsernamePasswordToken对象的token中, 调用SecurityUtils.getSubject().login(token)方法,将 token传入

接下来看看login方法的实现:

主要还是用到了securityManager安全管理器

进入securityManager里边的login方法,看看他的实现:

在这个方法中定义了AuthenticationInfo对象来接受从Realm传来的认证信息

进入authenticate方法中

发现调用了authenticator的authenticate这个方法

进入this.authenticator.authenticate(token)这个方法中

在这个 类中调用了这个方法,再进去看他的实现

  1.  
    protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {
  2.  
    this.assertRealmsConfigured();
  3.  
    Collection<Realm> realms = this.getRealms();
  4.  
    return realms.size() == 1?this.doSingleRealmAuthentication((Realm)realms.iterator().next(), authenticationToken):this.doMultiRealmAuthentication(realms, authenticationToken);
  5.  
    }

在这里才是刚才前边的那个authenticator的实现, this.assertRealmsConfigured() 这个方法是判断realm是否存在,不存在则抛出异常,他会根据realm的个数来判断执行哪个方法,上篇中springboot整合shiro我只配置了一个realm,所以他只会执行this.doSingleRealmAuthentication((Realm)realms.iterator().next(), authenticationToken)这个方法,并且会将 realm和token作为参数传入,这里的realm其实就是自己定义的MyShiroRealm

接下来再进入doSingleRealmAuthentication这个方法中,

在这里 他会先判断realm是否支持token

接下来执行else中的getAuthenticationInfo方法

this.getCachedAuthenticationInfo(token)这个方法是从shiro缓存中读取用户信息,如果没有,才从realm中获取信息。如果是第一次登陆,缓存中肯定没有认证信息,所以会执行this.doGetAuthenticationInfo(token)这个方法。

查看this.doGetAuthenticationInfo(token)方法,会发现有这么几个类提供我们选择

其中就有我们自定义的realm,进去

所以 ,上边的doGetAuthorizationInfo是 执行的我们自定义realm中重写的doGetAuthorizationInfo这个方法。这个方法就会从数据库中读取我们所需要的信息,最后封装成SimpleAuthorizationInfo返回去。

现在获取到认证信息了,接下来就是shiro怎么去进行认证,我们返回去看

获取 完信息之后就是进行密码匹配,进入assertCredentialsMatch方法中看一下,

首先 获取一个CredentialsMatcher对象,译为凭证匹配器,这个类的主要作用就是将用户输入的密码一某种计算加密。

再看一下cm.doCredentialsMatch(token,info)

这里会用到equals方法对token中加密的密码和从数据库中取出来的info中的密码进行对比,如果认证相同就返回true,失败就返回false,并抛出AuthenticationException,将info返回到defaultSecurityManager中,到此认证过程结束。

原文链接:https://blog.csdn.net/caoyang0105/article/details/82769293

shiro登录认证过程讲解的更多相关文章

  1. spring boot(十四)shiro登录认证与权限管理

    这篇文章我们来学习如何使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求.在Java领域一般有Spring Security ...

  2. Shiro 登录认证源码详解

    Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...

  3. springboot+mybatis+shiro——登录认证和权限控制

    转载:https://z77z.oschina.io/ 一.引入依赖 shiro-all包含shiro所有的包.shiro-core是核心包.shiro-web是与web整合.shiro-spring ...

  4. Linux的SSH免密登录认证过程研究

    一.先看下SSH免密登录使用到的工具和生成的文件 工具:ssh-keygen用于生成秘钥文件,其中秘钥分为公钥和私钥.ssh-copy-id用于复制公钥文件到被控制机. 文件:ssh-keygen生成 ...

  5. shiro登录认证

    新建maven文件create a simple project shiro.ini文件 [users] root=123456 log4j.properties log4j.rootLogger=I ...

  6. Spring Cloud之路:(七)SpringBoot+Shiro实现登录认证和权限管理

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sage_wang/article/details/79592269一.Shiro介绍1.Shiro是 ...

  7. 学习Spring Boot:(十三)配置 Shiro 权限认证

    经过前面学习 Apache Shiro ,现在结合 Spring Boot 使用在项目里,进行相关配置. 正文 添加依赖 在 pom.xml 文件中添加 shiro-spring 的依赖: <d ...

  8. 2、Shiro的认证

    Shiro的认证流程大体可以参考下面这幅图: 但是没有接触过shiro的同学看到上面的图片也不明白,下面我们来在代码中尝试体验Shiro的认证过程: 1.新建一个SpringBoot项目项目结构如下: ...

  9. springboot系列(十)springboot整合shiro实现登录认证

    关于shiro的概念和知识本篇不做详细介绍,但是shiro的概念还是需要做做功课的要不无法理解它的运作原理就无法理解使用shiro: 本篇主要讲解如何使用shiro实现登录认证,下篇讲解使用shiro ...

随机推荐

  1. easyUI footer 的格式渲染

    网上好多的例子,但是自己使用的情况下还是出现bug.比如以下代码: var myview = $.extend({}, $.fn.datagrid.defaults.view, { renderFoo ...

  2. css3制作网页动画

    一.CSS3变形 CSS3变形是一些效果的集合 如平移.旋转.缩放.倾斜效果 每个效果都可以称为变形(transform),它们可以分别操控元素发生平移.旋转.缩放.倾斜等变化 二.CSS3位移:tr ...

  3. pytest之assert断言

    assert pytest允许您使用标准Python断言来验证Python测试中的期望和值.例如,你可以写下 # content of test_assert1.py def f(): return ...

  4. [CF1304E] 1-Trees and Queries - LCA

    由于可以走重边,所以任意一条路径长 + 2 仍然对应至少一条合法路径 很显然我们有 \(3\) 种基本路径 不经过 \((x,y)\) 经过 \(x \to y\) 经过 \(y \to x\) 假设 ...

  5. ES源码阅读过程

    HTTP请求的controller:RestController 游标的作用 相当于建立了一个 limit的priorityqueue 不用游标的话,相当于建立一个limit+offset的prior ...

  6. [USACO12DEC]First!

    Description Luogu3065 Solution 首先,一个串要是最小的,别的串不能是它的前缀,且和它有相同前缀的串字典序都比他小. Trie树是显然要用的,难点在于如何判断能否最小.其实 ...

  7. IDEA 在SVN上更新代码错误: Error:Server SSL certificate rejected

    在IDEA中更新代码到SVN中 ,出现了   Error:Server SSL certificate rejected    ---服务器的SSL证书  的错误 之前在网上有找过一些相关的做法,但是 ...

  8. IIS添加网站

    打开IIS 在网站上面点击右键进行添加网站 进入添加网站配置

  9. day01_2spring3

    Bean基于XML和基于注解的装配 一.Bean基于XML的装配 1.生命周期接着day01_1来讲(了解) Bean生命周期的如图所示:用红色框起来的都是我们要研究的! 如图Bean is Read ...

  10. JavaScript的HelloWorld创建

    JavaScript JavaScript(简写为JS)是一门世界上最流行的脚本语言. ECMAScript是JavaScript的一个标准,最新版本到es6版本. 但是开发环境和线上环境存在版本不一 ...