Shiro作为轻量级的权限框架,Shiro的认证流程是怎样的一个过程。

如果没有对Shiro进行了解的话,建议先对Shiro学习笔记(一)学习一下Shiro基本的组

成。

1,几大重要组件解析

1.1,Authenticator认证流程

作为用户认证的关键模块,主要是为了返回AuthenticatorInfo信息。

翻开源码,查找到org.apache.shiro.authc包中,此包主要是用于认证的。

首先查看Authenticator接口发现,此接口类作为ShiroAPI的一个主要切入点之一,主要是验

证时候用于和Realm进行交互,根据提交的AuthenticationToken进行验证,成功之后返回

AuthenticationInfo实例。

上图表面,一般是不直接使用Authenticator实例进行交互,这里使用了实现Authenticator接

口的AbstractAuthenticator抽象类的子类ModularRealmAuthenticator类进行实例化。那么我

们看一下ModularRealmAuthenticator做了什么?

ModularRealmAuthenticator类中方法:

先看ModularRealmAuthenticator类中的构造方法,先注入了authenticationStrategy即认

证策略,看过上一章的小伙伴很清楚,Realm认证主要有四种策略,这里选择的其中一种

AtLeastOneSuccessfulStrategy(至少有一个Realm认证成功的策略)。

也可以通过GetterSetter设置Realm,设置authenticationStrategy等。

剩下的就是最关键的部分认证了,doAuthenticate方法是实现了Authenticator的接口方法,

根据是单Realm方式还是多Realm方式执行不同的实现方法。

现在进入单Realm认证方法看看:

类中先是对于token的类型做了判断,必须为authenticationToken类型才可以。随后通过

realm获取到AuthenticationInfo类,realm自己并不会去实现,上次文章也描述了,Realm具体

实现是由我们自己去实现验证判断的逻辑,Realm接口继承关系为:

Realm-->CachingRealm-->AuthenticatingRealm
-->AuthorizingRealm-->ModularRealmAuthenticator复制代码

下图是自定义Realm:

例如上图中的自定义MyRealm继承了AuthoriziongRealm抽象类,作为最底层子类,只需要实

现doGetAuthenticationInfo方法和doGetAuthorizationInfo方法(此方法下次讲述),之后返回

AuthenticationInfo对象。

realm.getAuthenticationInfo(token);
//等价于调用子类MyRealm中的doGetAuthenticationInfo方法
doGetAuthenticationInfo(token);复制代码

OK至此认证的任务就完成了,返回的AuthenticationInfo对象会传给SecurityManager进行

下一步操作。

1.2 Authorizer授权流程

认证说完了,同时Shiro还需要进行对用户的授权啊,授权和认证的流程非常相似,这里就简

要说一下。

同样的看一下org.apache.shiro.authz包下:

包内的结构和Authenticator很相似,首先看Authorizer这一基础接口,定义了很多我们所需要

的方法,例如是否具备权限,检查权限,检查角色,检查该用户是否具备该角色或者该权限。

其具体的实现类是AuthorizingRealm,AuthorizingRealm类不仅实现了Authorizer的所有方

法,我们在继承的时候只需要实现doGetAuthorizationInfo方法就可以了。

这里我们细致说一下AuthorizingRealm类,首先看类中:

类构造器加载了权限转换器PermissionResolver、缓存Name、密码匹配CredentialsMatcher

其中授权最核心的方法是getAuthorizationInfo,返回一个AuthorizationInfo对象,即完成授权

信息的获取。

上图这一段代码表述为Shiro先从Cache里读取之前是否以及获取过授权信息,首先调用

getAvailableAuthorizationCache()方法获取授权信息的Cache,并且定义authorizationCache

缓存,此缓存由getAuthorizationCacheLazy方法懒加载获取,通过CacheManager中

getCache(authorizationCacheName)获取。

authorizationCacheName在初始化构造时候就以及设定为如下

this.authorizationCacheName = getClass().getName() + DEFAULT_AUTHORIZATION_CACHE_SUFFIX;复制代码

从CacheManager中获取到Cache返回给上层。

如果缓存中没有,则调用doGetAuthorizationInfo()方法进行获取,那么此方法就是我们自己定

义的MyRealm中实现的逻辑。

设置相应的角色和权限集合放置在AuthorizationInfo对象中即可。

OK获取授权信息到此就结束了。

下一次开始讲述核心部件流程SecurityManager。

转载于:https://juejin.im/post/5c52a3d7518825241060a317

Shiro学习笔记(三)源码解析相关推荐

  1. Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  2. 深度学习框架Caffe源码解析

    作者:薛云峰(https://github.com/HolidayXue),主要从事视频图像算法的研究, 本文来源微信公众号:深度学习大讲堂.  原文:深度学习框架Caffe源码解析  欢迎技术投稿. ...

  3. sheng的学习笔记-Vector源码分析

    概述 Vector底层也是数组,跟ArrayList很像(先看下ArrayList,再看Vector会很轻松),ArrayList可参考下文,并且由于效率低,已经被淘汰了,大概瞅瞅得了 sheng的学 ...

  4. nginx开发笔记_ngx_hash源码解析

    ngx_hash源码解析 ngx_hash是nginx中的hash表结构,具有以下特点: 静态结构,hash表创建后无法动态添加/删除KV. 采用连续存储方式解决碰撞问题.即出现碰撞的KV存放在连续地 ...

  5. PixHawk学习笔记 之 源码浅析——mc_pos_control.cpp——task_main

    注意:基于"Firmware-1.6.0rc1" 献上固件源码分享链接:https://pan.baidu.com/s/1kUPocmF 密码:j55a 自己边学边写的,一定有错, ...

  6. shiro学习笔记(三)知识整合

    参考 小D课堂 二当家小D老师的笔记 小滴课堂官网:https://xdclass.net/#/index 官网 第1章 Shiro权限实战课程介绍 第1集 Shiro权限实战课程介绍 简介:讲解为什 ...

  7. yolov1-v5学习笔记及源码解读

    目录 深度学习网络分类 评价指标 原理 yolov1 yolov2 yolov3 yolov4 yolov5 源码解读(v3为例) 深度学习网络分类 深度学习经典检测方法 通常分为 two-stage ...

  8. 狂神说SpringCloud学习笔记(附带源码和笔记)

    狂神说Spring Cloud Netflix笔记-01(服务注册与发现) 狂神说Spring Cloud Netflix笔记-02(Eureka集群的搭建 ) 狂神说Spring Cloud Net ...

  9. android源码编译 简书,android学习笔记之源码编译

    编译环境 1.需要Ubuntu 64bit,建议Ubuntu14.04 64-bit 2.安装openJDK7 $ sudo apt-get update $ sudo apt-get install ...

  10. 通讯框架 t-io 学习——websocket 部分源码解析

    前言 前端时间看了看t-io的websocket部分源码,于是抽时间看了看websocket的握手和他的通讯机制.本篇只是简单记录一下websocket握手部分. WebSocket握手 好多人都用过 ...

最新文章

  1. 真实工作经验总结——案例解析企业选型操作步骤
  2. 皮一皮:大哥!二弟!三弟!
  3. 怎么git 自己建的服务器_如何搭建自己的git服务器
  4. 挺好用的SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面)
  5. ecshop后台实现用ajax动态修改/更新用户评论的时间
  6. h5页面如何预览excel文件_移动端页面,如何解析预览 word/excel/PDF文件?
  7. 增加或修改的存储过程
  8. 【aviator】aviator 报错 EOF while reading string at index
  9. 怎么做圆形二维码_圆形吊顶怎么做?装修网盘点圆形吊顶安装注意事项
  10. java怎样读取数据库表中字段的数据类型?
  11. ProgressBar进度条使用注解
  12. 企业如何高效用云?| 资深运维架构师细说云架构下的运维体系构建
  13. AXURE中SVG矢量图标的使用方法,以及图标颜色的改变方法
  14. 弹出窗口背景透明 css,CSS弹出背景半透明窗口
  15. 饥荒海难创建显示专用服务器,饥荒联机版服务器移除实体指令分享
  16. 第十届山东理工大学ACM网络编程擂台赛 重现
  17. 【Scratch画图100例】图39-scratch实心圆 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例
  18. 初读《设计模式之禅》
  19. pycharm所有版本 http://www.jetbrains.com/pycharm/download/previous.html 打开激活窗口 选择 Activate new license
  20. 9亿财产如何分配:大S与汪小菲离婚所感

热门文章

  1. oracle小鸡与合计,oracle 小鸡初始化配置(密码登录/防火墙/bbr)
  2. react-native通信流程
  3. 通用CR安装教程|CORONA渲染器怎么一步一步安装到测试与成品大图出效果图渲染参数的设置?
  4. java字符串截取遇到的字符,java 截取字符串遇到的有关问题
  5. python视频车流量计数_视频访问量实时统计项目学习
  6. Mocha Pro Mac破解版(AE平面跟踪和视觉效果插件)破解方法
  7. mysql8.0 【1045 - Access denied for user ‘root‘@‘localhost‘(using password: YES)】报错
  8. 应用支持向量机对婴儿EEG数据进行多元模式分析
  9. 国内有哪些光伏逆变器厂家排进世界前十的?
  10. dvwa小马上传大马php,集训第六天:文件上传漏洞