文章目录

  • 一、授权流程
    • 1.1 AccessDecisionManager
    • 1.2 授权决策

一、授权流程

Spring Security可以通过 http.authorizeRequests()web请求进行授权保护。 Spring Security使用标准 Filter建立了对 web请求的拦截,最终对资源的授权访问。

Spring Security的授权流程如下:


分析授权流程:

  1. 拦截请求,已认证用户访问受保护的 web资源被 SpringFilterChain中的 FilterSecurityInterceptor的子类拦截。

  2. 获取资源访问策略FilterSecurityInterceptor会从 SecurityMetadataSource的子类 DefaultFilterInvocationSecurityMetadataSource获取要访问当前资源所需要的权限 Collection<configattribute></configattribute>

SecurityMetadataSource读取访问策略的抽象,而读取的内容,就是我们配置的访问规则,读取的访问策略如:

http
.authorizeRequests() .antMatchers("/r/r1").hasAuthority("p1")
.antMatchers("/r/r2").hasAuthority("p2")
...
  1. 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实现类如下,它们分别是 AffirmativeBasedConsensusBasedUnaimousBasedSpring Security默认使用的是 AffirmativeBased

​1、AffirmativeBased:

①只要有 AccessDecisionVoter的投票为 ACCESS_GRANTED则同意用户进行访问;

②如果全部弃权也表示通过;

③如果没有一个投赞成票,但是有人投反对票,则将抛出 AccessDeniedException

​2、ConsensusBased:

①如果赞成票多余反对票则表示通过;

②如果反对票多于赞成票则将抛出 AccessDeniedException

③如果赞成票与反对票相同且不等于0,并且属性 allowEqualGrantedDeniedDecision的值为true,则表示通过,否则将抛出 AccessDeniedExceptionallowEqualGrantedDeniedDecision的默认值为true。

④如果所有的 AccessDecisionVoter都弃权了,则将视参数 allowIfAllAbstainDecisions的值而定,如果该值为true则表示通过,否则将抛出异常 AccessDeniedException。参数 allowIfAllAbstainDecisions的值默认为false。

3、UnanimousBased:

UnanimousBased的逻辑与另外两种实现有点不一样,另外两种会一次性把受保护对象的配置属性全部传递给 AccessDecisionVoter进行投票,而 UnanimousBased会一次只传递一个 ConfigAttributeAccessDecisionVoter进行投票。这也就意味着如果我们的 AccessDecisionVoter的逻辑是只要传递进来的 ConfigAttribute中有一个能够匹配则投赞成票,但是放到 UnanimousBased中其投票结果就不一定是赞成了。 UnanimousBased的逻辑具体来说是这样的:
①如果受保护对象配置的某一个 ConfigAttribute被任意的 AccessDecisionVoter反对了,则将抛出 AccessDeniedException

②如果没有反对票,但是有赞成票,则表示通过。

③如果全部弃权了,则将视参数 allowIfAllAbstainDecisions的值而定,true则通过,false则抛出 AccessDeniedException

Spring Security也内置一些投票者实现类如 RoleVoterAuthenticatedVoterWebExpressionVoter等。

SpringSecurity(二) :授权流程相关推荐

  1. 五.SpringSecurity基础-授权流程

    1.授权流程分析 授权一定是在认证通过之后,授权流程是通过FilterSecurityInterceptor拦截器来完成,FilterSecurityInterceptor通过调用SecurityMe ...

  2. SpringSecurity(三)授权流程

    授权流程 1.拦截请求,已认证用户访问受保护的web资源将被SecurityFilterChain中(实现类为DefaultSecurityFilterChain)的 FilterSecurityIn ...

  3. 基于Spring Security的认证授权_认证原理_授权流程_Spring Security OAuth2.0认证授权---springcloud工作笔记126

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们再来看springsecurity的授权流程. 可以看到,这个认证的过程,之前我们都已经用 ...

  4. SpringBoot集成SpringSecurity(二) 个性化登录配置(remember-me mongodb)

    前言 本文件所记录的是使用SpringSecurity实现remember me功能,有兴趣的朋友可以继续阅读,有何不足之处还请各位指出(本文未对用户 -  角色 - 权限三者的关系进行详细介绍详情见 ...

  5. SpringSecurity登录认证流程

    SpringSecurity登录认证流程 目录 SpringSecurity简介 springSecurity登录认证流程 一.Springsecurity简介 ​ Spring Security是一 ...

  6. spring-security认证授权

    授权是在认证后对资源的权限控制,权限控制很多系统中都需要,但是不同的系统对于权限的敏感程度不同,因而权限的设计实现方式不同. rbac权限模型可以分为基于角色的权限控制和基于资源的权限控制 基于角色的 ...

  7. Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权

    一.Shiro授权: 1.授权与权限: (1)授权:访问控制,必须具有该资源的访问权限才可以访问该资源. (2)权限模型:标准权限数据模型包括 :用户.角色.权限(包括资源和权限).用户角色关系.角色 ...

  8. Asp.Net Core 中IdentityServer4 授权流程及刷新Token

    一.前言 上面分享了IdentityServer4 两篇系列文章,核心主题主要是密码授权模式及自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的授权 ...

  9. 更新一波,微信第三方开发平台授权流程

    最近一直忙于微信三方开发平台开发,更新一下,做个记录,微信第三方开发平台授权流程示例: 先看授权流程要拿到的结果: 照例先给出微信授权流程官网页面:https://open.weixin.qq.com ...

最新文章

  1. 数据持久化(六)之Using CoreData with MagicalRecord
  2. Android SDK下载失败-Android SDK Manager国内无法更新的解决方案
  3. php阿里云oss文件上传
  4. redis watch使用场景_[Redis] 常用类型及应用场景
  5. java网络编程Socket中SO_LINGER选项的用法解读
  6. 彻底卸载SqlServer2008R2
  7. 深入解析Python中函数的参数与作用域
  8. 计算机英语bane,英语单词bane是什么意思,英文单词查询bane,在线单词bane翻译...
  9. linux下,如何迁移mysql数据库存放目录。利用软连接简单快捷实现移动到home数据盘下...
  10. Ant Design + React 中将分页组件的英文转为中文
  11. 雪球网 json 获取
  12. minio服务报403错误
  13. “select count (1)”是什么意思?
  14. MT 202 COV General Financial Institution Transfer 覆盖一般金融机构转账
  15. 凯撒密码加解密及破解实现原理
  16. 记录微信小程序web-view页面分享出去之后没有返回首页按钮,微信小程序WebView页面分享出去后没有返回首页按钮,全局使用的自定义导航【解决办法】
  17. 分治法求解最小和第二小元素
  18. git 重置用户名 密码信息
  19. 显微镜常用技术参数和专属名词
  20. STM32F05x加入RDP(LV1)后,Segger无法Unlock的解决办法

热门文章

  1. Vue 设置背景图片样式
  2. 数据模型是什么,有哪些常见的分析方法? 财务、人力、运营等数据分析人士必看!(内附2000+套数据可视化模版)
  3. 两数之和(LeetCode)
  4. Python——dat文件批量合并为同一个csv文件
  5. C语言实现字符串对应替换
  6. Apriori算法python实现(数据挖掘学习笔记)
  7. 大数据数据采集工具简介
  8. android代码混淆个人总结及踩坑
  9. 视频号添加任意小程序
  10. java中根据权重随机获取数据