Shiro授权认证原理和流程
先来张图:

这是一张shiro的功能图:
- Authentication: 身份认证/登录,验证用户是否拥有相应的身份
- Authorization: 授权/权限验证,验证某个已认证的用户是否拥有某个权限,包括验证用户是否拥有某个角色,或拥有某个操作权限
- Session Management: 会话管理,shiro拥有自己的session(不需要web环境下就能使用)
- Cryptography: 加密
- Web Support: web支持,针对web应用提供一些功能
- Caching: 缓存
- Concurrency: shiro支持多线程应用的并发验证,即在一个线程中开启另一个线程,能把权限自动传播过去
- Testing: 测试支持
- Run As: 允许一个用户假装成为另一个用户(如果允许)的省份进行访问
- Remember Me: 记住用户身份
再来一张图:

- Subject: 与应用交互的用户,Subject在shiro中是一个接口,定义了很多认证授权的方法,外部程序通过Subject进行认证授权,而Subject通过SecurityManager进行认证授权
注意: Subject只是一个门面,SecurityManager才是实际的执行者 - SecurityManager: 安全管理器,所有与安全有关的操作都会与SecurityManager交互,且管理着所有的Subject,是shiro的核心,负责与shiro其他组件进行交互,如通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等
补充: SecurityManager是一个接口,继承了Authenticator,Authorizer,SessionManager三个接口 - Realm: Shiro从Realm获取安全数据(如用户,角色,权限);也就是说SecurityManager要验证用户身份或操作权限,需要从Realm获取相应数据来判断(用户是否能登录,是否拥有什么权限等)
注意: realm也是由SecurityManager控制
再来一张图:

- Subject: 与应用交互的用户
- SecurityManager: 相当于SpringMVC中的DispatcherServlet,所有具体的交互都由SecurityManager控制;它管理着所有的Subject,且负责进行认证,授权,会话和缓存的管理
- Authenticator: 认证器, 对用户身份进行验证;Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,也可以自定义
- Authorizer: 授权器,决定用户是否有权限进行某种操作,控制着用户能访问应用中的哪些功能
- Realm: 安全实体数据源,可以有1个或多个
- SessionManager: 管理session的生命周期(可以实现单点登录)
- CacheManager: 缓存管理器
- Cryptography: 密码管理模块
认证流程

- 创建token令牌,token中有用户提交的认证信息即帐号和密码
- 执行Subject.login(token),Subject实例通常是DelegatingSubject类(或子类)的实例对象;在认证开始时,通过SecurityManager实例来调用securityManager.login(token)方法
- SecurityManager接受到token(令牌)信息后委托Authenticator实例进行认证;Authenticator通过实现类ModularRealmAuthenticator来调用anthenticator.authenticate(token)方法;ModularRealmAuthenticator在认证过程中会对一个或多个Realm实例进行适配(可插拔)
- 如果配置了多个Realm,ModularRealmAuthenticator会根据配置的AuthenticationStrategy(认证策略)来进行多Realm的认证过程;在Realm被调用后,AuthenticationStrategy将对每一个Realm的结果做出响应
注意: 如果只有一个Realm,Realm将直接调用而无需再配置认证策略 - 判断每一个Realm是否都支持提交的token,如果支持,Realm调用getAuthenticationInfo(token),该方法就是实际的认证处理,我们通过覆盖Realm的doGetAuthenticationInfo方法来编写我们自定义的认证处理
- shiro中有三种认证策略的具体实现:
- AtleastOneSuccessfulStrategy: 只要有一个realm验证成功,则成功
- FirstSuccessfulStrategy: 第一个realm验证成功,则成功,后续realm将被忽略
- AllSuccessfulStrategy: 所有realm成功,验证才成功
补充: 认证失败后抛出的一些异常:
- UnknownAccountException 帐号不存在
- IncorrectCredentialsException 密码错误
- DisabledAccountException 帐号被禁用
- LockedAccountException 帐号被锁定
- ExcessiveAttemptsException 登录失败次数过多
- ExpiredCredentialsException 凭证过期
自定义Realm
shiro自带的Realm接口,CachingRealm负责缓存处理,AuthenticationRealm负责认证,AuthorizingRealm负责授权等,但是通常情况下,正确的用户信息都是从数据库中取出,所以需要自定义realm,通常自定义的realm继承AuthorizingRealm,认证是重写doGetAuthenticationInfo(AuthenticationToken token)方法,授权是重写doGetAuthorizationInfo(PrincipalCollection principals)方法
授权流程

- 调用授权验证方法(Subject.isPermitted()或Subject.hasRole()等)
- Subject实例通常是DelegatingSubject类(或子类)的实例对象;在认证开始时,通过SecurityManager实例来调用securityManager.isPermitted(string)方法/security.hasRole(string)方法
- SecurityManager委托Authorizer的实例(默认是ModularRealmAuthorizer类的实例,同样支持多个realm)调用相应的授权方法
- 每一个Realm将检查是否实现了相同的Authorizer接口,然后调用Realm自己的相应的授权验证方法
- 使用多个Realm时,不同于认证策略处理方式,授权处理过程中:
- 当调用Realm出现异常时,立即抛出,结束授权验证
- 只要一个Realm验证成功,则认为授权成功,立即返回,结束验证
Shiro授权认证原理和流程的更多相关文章
- frame shiro 授权及原理简述
shiro 授权模式 shiro采用的是rbac授权模式rbac,基于角色的权限管理,谁扮演什么角色,被允许做什么事情. shiro 授权流程 shiro 授权方式 1.编程式 通过写if/else授 ...
- 第三章:shiro授权认证
授权:也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等). 主体:即访问应用的用户,在Shiro中使用Subject代表该用户.用户只有授权后才允许访问相应的资源. 资源 ...
- Shiro的认证原理(Subject#login的背后故事)
登录操作一般都是我们触发的: Subject subject = SecurityUtils.getSubject(); AuthenticationToken authenticationToken ...
- ASP.NET Core 中jwt授权认证的流程原理
目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...
- 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权
原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...
- shiro权限认证与授权
什么是shiro? Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 为什么要用sh ...
- Shiro授权流程
1,授权中涉及的一些概念 [1]授权:访问控制,即在应用中认证用户能否访问的系统资源(如一个页面,一个按钮等). [2]资源:在Web应用中反应为用户可以访问的URL. ...
- Shiro的认证与授权
shiro实战教程 一.权限管理 1.1什么是权限管理 基本上涉及到用户参与的系统都需要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以 ...
- Linux可插拔认证模块(PAM)的配置文件、工作原理与流程
PAM的配置文件: 我们注意到,配置文件也放在了在应用接口层中,他与PAM API配合使用,从而达到了在应用中灵活插入所需鉴别模块的目的.他的作用主要是为应用选定具体的鉴别模块,模块间的组合以及规定模 ...
随机推荐
- matlab基本语法
MATLAB基本语法 点乘运算 , 常与其他运算符 点乘运算,常与其他运算符联合使用(如.\) 矩阵生成 矩阵生成 向量生成或子阵提取本节将会介绍一些MATLAB的基本语法的使用. 持续更新... 在 ...
- QT-简介
前言:Qt是一款强大的跨平台gui(图形界面开发)开发工具. 一.安装说明 Qt安装包: qt-opensource-windows-x86-mingw492-5.6.1-1.exe -------- ...
- ROS安装教程
对于ROS的安装,在它的官方网站: http://wiki.ros.org/ROS/Installation 中也有详细说明.但是对于像博主这样先天英语发育不全的人来说,直接看官网还是有点困难的. 所 ...
- POJ 1414 暴搜
题意比较复杂 (但是很好理解) 大概意思是给你等边三角形(详见题目中的图). 最后一行有n个数,下一次要填的数是c. 里面预先已经填好了数字.(0为未填) 得分的标准是这个分数的连通块周围没有空的地方 ...
- Linux下安装 php-memcache 扩展
需要的库:yum install -y libmemcached libmemcached-devel 下载:https://pecl.php.net/package/memcached 安装: un ...
- <Android Framework 之路>Android5.1 Camera Framework(四)——框架总结
前言 从之前的几篇文件,可以基本弄清楚 Camera从APK,经过framework的衔接,与HAL层进行交互,最终通过驱动完成Camera的一些动作. Camera层次分析 APP层 Framewo ...
- BottomSheetBehavior 结合CoordinatorLayout实现底部栏
1.xml <?xml version="1.0" encoding="utf-8"?> <android.support.design.wi ...
- maridb Error 'Operation DROP USER failed for
数据库版本:mariadb 10.0.12 主库删除多余的用户名,因从库没有此信息造成主从故障! 报错信息如下:Error 'Operation DROP USER failed for 'use ...
- Uva 11324 The Largest Clique【强连通 DAG动规 spfa】
白书上的例题 做一遍tarjan后,缩点,每一个scc节点的权为它的结点数,做一次DAG上的动规,求出路径上的最大点权和,就可以了 #include<cstdio> #include< ...
- Stack Overflow大揭密:哪一种程序员工资最高?
Stackoverflow在程序员之间可以說是无人不知无人不晓,甚至常有人开玩笑说:“如果stackoverflow倒闭了,全世界代码的产出率将下降一半以上”或许听起来有点夸张,但是不难想像这个网站在 ...