SpringSecurity(二) :授权流程
文章目录
- 一、授权流程
- 1.1 AccessDecisionManager
- 1.2 授权决策
一、授权流程
Spring Security
可以通过 http.authorizeRequests()
对 web
请求进行授权保护。 Spring Security
使用标准 Filter
建立了对 web
请求的拦截,最终对资源的授权访问。
Spring Security
的授权流程如下:
分析授权流程:
拦截请求,已认证用户访问受保护的
web
资源被SpringFilterChain
中的FilterSecurityInterceptor
的子类拦截。获取资源访问策略,
FilterSecurityInterceptor
会从SecurityMetadataSource
的子类DefaultFilterInvocationSecurityMetadataSource
获取要访问当前资源所需要的权限Collection<configattribute></configattribute>
。
SecurityMetadataSource
读取访问策略的抽象,而读取的内容,就是我们配置的访问规则,读取的访问策略如:
http
.authorizeRequests() .antMatchers("/r/r1").hasAuthority("p1")
.antMatchers("/r/r2").hasAuthority("p2")
...
FilterSecurityInterceptor
会调用AccessDecisionManager
进行授权决策,若决策通过,则允许访问资 源,否则将禁止访问。
1.1 AccessDecisionManager
AccessDecisionManager
接口定义:
public interface AccessDecisionManager {void decide(Authentication var1, Object var2,Collection<ConfigAttribute> var3)throws AccessDeniedException,InsufficientAuthenticationException;boolean supports(ConfigAttribute var1);boolean supports(Class<?> var1);
}
decide()
方法是 AccessDecisionManager
的核心, 用来鉴定当前用户是否有访问对应受保护资源的权限,其中参数:
var1
:要访问资源的访问者的身份
var2
:要访问的受保护资源,web请求对应 FilterInvocation
var3
:是受保护资源的访问策略,通过 SecurityMetadatasource
1.2 授权决策
AccessDecisionManager
采用投票的方式来确定是否能够访问受保护资源。
通过上图可以看出, AccessDecisionManager
中包含了一系列 AccessDecisionVoter
将会被用来对 Authentication
是否有权访问受保护对象进行投票, AccessDecisionManager
根据投票结果,做出最终决策。
AccessDecisionVoter
接口定义如下:
public interface AccessDecisionVoter<S> {int ACCESS_GRANTED = 1;int ACCESS_ABSTAIN = 0;int ACCESS_DENIED = -1;boolean supports(ConfigAttribute var1);boolean supports(Class<?> var1);int vote(Authentication var1, S var2,Collection<ConfigAttribute> var3);
}
vote()
的返回结果会是 AccessDecisionVoter
中定义的三个常量之一。 ACCESS_GRANTED
表示同意, ACCESS_DENIED
表示拒绝, ACCESS_ABSTAIN
表示弃权。如果 AccessDecisionVoter
不能判定当前 Authentication
是否拥有访问对应受保护对象的权限,则 vote()
方法的返回值为 ACCESS_ABSTAIN
。
Spring Security
内置了三个基于投票的 AccessDecisionManager
实现类如下,它们分别是 AffirmativeBased
、 ConsensusBased
和 UnaimousBased
。 Spring Security
默认使用的是 AffirmativeBased
。
1、AffirmativeBased:
①只要有 AccessDecisionVoter
的投票为 ACCESS_GRANTED
则同意用户进行访问;
②如果全部弃权也表示通过;
③如果没有一个投赞成票,但是有人投反对票,则将抛出 AccessDeniedException
。
2、ConsensusBased:
①如果赞成票多余反对票则表示通过;
②如果反对票多于赞成票则将抛出 AccessDeniedException
。
③如果赞成票与反对票相同且不等于0,并且属性 allowEqualGrantedDeniedDecision
的值为true,则表示通过,否则将抛出 AccessDeniedException
。 allowEqualGrantedDeniedDecision
的默认值为true。
④如果所有的 AccessDecisionVoter
都弃权了,则将视参数 allowIfAllAbstainDecisions
的值而定,如果该值为true则表示通过,否则将抛出异常 AccessDeniedException
。参数 allowIfAllAbstainDecisions
的值默认为false。
3、UnanimousBased:
UnanimousBased
的逻辑与另外两种实现有点不一样,另外两种会一次性把受保护对象的配置属性全部传递给 AccessDecisionVoter
进行投票,而 UnanimousBased
会一次只传递一个 ConfigAttribute
给 AccessDecisionVoter
进行投票。这也就意味着如果我们的 AccessDecisionVoter
的逻辑是只要传递进来的 ConfigAttribute
中有一个能够匹配则投赞成票,但是放到 UnanimousBased
中其投票结果就不一定是赞成了。 UnanimousBased的逻辑具体来说是这样的:
①如果受保护对象配置的某一个 ConfigAttribute
被任意的 AccessDecisionVoter
反对了,则将抛出 AccessDeniedException
。
②如果没有反对票,但是有赞成票,则表示通过。
③如果全部弃权了,则将视参数 allowIfAllAbstainDecisions
的值而定,true则通过,false则抛出 AccessDeniedException
。
Spring Security
也内置一些投票者实现类如 RoleVoter
、 AuthenticatedVoter
和 WebExpressionVoter
等。
SpringSecurity(二) :授权流程相关推荐
- 五.SpringSecurity基础-授权流程
1.授权流程分析 授权一定是在认证通过之后,授权流程是通过FilterSecurityInterceptor拦截器来完成,FilterSecurityInterceptor通过调用SecurityMe ...
- SpringSecurity(三)授权流程
授权流程 1.拦截请求,已认证用户访问受保护的web资源将被SecurityFilterChain中(实现类为DefaultSecurityFilterChain)的 FilterSecurityIn ...
- 基于Spring Security的认证授权_认证原理_授权流程_Spring Security OAuth2.0认证授权---springcloud工作笔记126
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们再来看springsecurity的授权流程. 可以看到,这个认证的过程,之前我们都已经用 ...
- SpringBoot集成SpringSecurity(二) 个性化登录配置(remember-me mongodb)
前言 本文件所记录的是使用SpringSecurity实现remember me功能,有兴趣的朋友可以继续阅读,有何不足之处还请各位指出(本文未对用户 - 角色 - 权限三者的关系进行详细介绍详情见 ...
- SpringSecurity登录认证流程
SpringSecurity登录认证流程 目录 SpringSecurity简介 springSecurity登录认证流程 一.Springsecurity简介 Spring Security是一 ...
- spring-security认证授权
授权是在认证后对资源的权限控制,权限控制很多系统中都需要,但是不同的系统对于权限的敏感程度不同,因而权限的设计实现方式不同. rbac权限模型可以分为基于角色的权限控制和基于资源的权限控制 基于角色的 ...
- Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权
一.Shiro授权: 1.授权与权限: (1)授权:访问控制,必须具有该资源的访问权限才可以访问该资源. (2)权限模型:标准权限数据模型包括 :用户.角色.权限(包括资源和权限).用户角色关系.角色 ...
- Asp.Net Core 中IdentityServer4 授权流程及刷新Token
一.前言 上面分享了IdentityServer4 两篇系列文章,核心主题主要是密码授权模式及自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的授权 ...
- 更新一波,微信第三方开发平台授权流程
最近一直忙于微信三方开发平台开发,更新一下,做个记录,微信第三方开发平台授权流程示例: 先看授权流程要拿到的结果: 照例先给出微信授权流程官网页面:https://open.weixin.qq.com ...
最新文章
- 数据持久化(六)之Using CoreData with MagicalRecord
- Android SDK下载失败-Android SDK Manager国内无法更新的解决方案
- php阿里云oss文件上传
- redis watch使用场景_[Redis] 常用类型及应用场景
- java网络编程Socket中SO_LINGER选项的用法解读
- 彻底卸载SqlServer2008R2
- 深入解析Python中函数的参数与作用域
- 计算机英语bane,英语单词bane是什么意思,英文单词查询bane,在线单词bane翻译...
- linux下,如何迁移mysql数据库存放目录。利用软连接简单快捷实现移动到home数据盘下...
- Ant Design + React 中将分页组件的英文转为中文
- 雪球网 json 获取
- minio服务报403错误
- “select count (1)”是什么意思?
- MT 202 COV General Financial Institution Transfer 覆盖一般金融机构转账
- 凯撒密码加解密及破解实现原理
- 记录微信小程序web-view页面分享出去之后没有返回首页按钮,微信小程序WebView页面分享出去后没有返回首页按钮,全局使用的自定义导航【解决办法】
- 分治法求解最小和第二小元素
- git 重置用户名 密码信息
- 显微镜常用技术参数和专属名词
- STM32F05x加入RDP(LV1)后,Segger无法Unlock的解决办法