Spring Security授权架构介绍

news/2024/11/19 19:23:01/

授权架构重点在于从 Authentication 中获得该认证所具有的权限 GrantedAuthority,以及对请求或路径设置访问所需权限。

GrantedAuthority

在之前的Spring Security:认证架构中,我们已经介绍了在 Authentication 中存储 GrantedAuthority 的方式,Authentication 拥有一个 GrantedAuthority 的集合,这代表了这个认证所具有的权限。

AccessDecisionManager(一个用来校验认证 Authentication 是否具有所需权限的接口)将从 Authentication 中获得 GrantedAuthority ,并调用 GrantedAuthority 接口唯一的一个方法 String getAuthority() 来获得所拥有权限的一个精确的 String 表示。

默认情况下,基于角色的授权规则以 ROLE_ 作为前缀。这意味着,如果有一个授权规则要求 security context 的角色是 "USER",Spring Security 将默认寻找调用 getAuthority() 返回 "ROLE_USER" 的 GrantedAuthority。

配置GrantedAuthorityDefaults Bean可以更改前缀:

@Bean
static GrantedAuthorityDefaults grantedAuthorityDefaults() {return new GrantedAuthorityDefaults("MYPREFIX_");
}

AuthorizationManager

AuthorizationManager 是做出最终的访问控制决定的接口,被各类授权组件所调用,包含两个方法:

AuthorizationDecision check(Supplier<Authentication> authentication, Object secureObject);default AuthorizationDecision verify(Supplier<Authentication> authentication, Object secureObject)throws AccessDeniedException {// ...
}

AuthorizationManager 的 check 方法被传递它所需要的所有相关信息,以便做出授权决定。

secureObject 中包含需要的任何客户参数,然后 AuthorizationManager 中进行验证。如果通过,返回“positive”的AuthorizationDecision;如果不通过,返回“negative”的AuthorizationDecision;如果不作出决定,则返回空的 AuthorizationDecision。

verify 方法调用 check,然后在出现 "negative" 的 AuthorizationDecision 决定时抛出一个 AccessDeniedException。

Spring Security 提供了一个代理类的 AuthorizationManager(RequestMatcherDelegatingAuthorizationManager),可以与别的 AuthorizationManager 协作。

常用的实现:

  • AuthorityAuthorizationManager:在当前 Authentication 中寻找一组给定的授权。如果包含任一配置的授权,返回 positive,否则返回 negative。
  • AuthenticatedAuthorizationManager:用来区分匿名、完全认证和记住我认证的用户。许多网站在Remember-me认证下允许某些有限的访问,但要求用户通过登录来确认他们的身份以获得完整的访问。
  • 其他请自行了解。

基本流程

(仅为基于HTTP请求授权的基本流程)

注意:默认情况下,AuthorizationFilter 是 Spring Security filter chain 中的最后一个,这说明 Spring Security 的 authentication filter、漏洞保护 和其他 filter 集成都不需要授权。如果你在 AuthorizationFilter 之前添加自己的 filter,它们也将不需要授权;否则,它们将需要授权。(Spring MVC的 DispatcherServlet 位于 AuthorizationFilter 之后,所以都是需要授权的。)

  1. 首先,AuthorizationFilter 构造一个 Supplier,从 SecurityContextHolder 中检索一个 Authentication。
  2. 将 Supplier 和 HttpServletRequest 传递给 AuthorizationManager。AuthorizationManager 将请求与 authorizeHttpRequests 中的模式相匹配,并运行相应的规则。
  3. 如果没有权限,会发布一个 AuthorizationDeniedEvent,并抛出一个 AccessDeniedException。在这种情况下,ExceptionTranslationFilter 会处理 AccessDeniedException。
  4. 如果拥有权限,会发布一个 AuthorizationGrantedEvent,进入后续的过滤器链。

http://www.ppmy.cn/news/1186360.html

相关文章

复习Animate和木疙瘩学习笔记-动画制作的回家之路

这个融媒体H5制作平台功能比较完善&#xff1a;包含了Flash(现在叫Animate)传统H5网页制作 720全景视频制作发布网页&#xff01; 主要功能&#xff1a;素材导入、2D动画制作、常见交互添加、发布生成链接二维码 基本就是一个制作H5为主&#xff0c;但是里面的动画可以依赖4种…

ubuntu配置 Conda 更改默认环境路径

我的需求是以后凡是新建一个虚拟环境都需要安装在一个挂载了大容量的分区/data里面 /home里面的是即将爆满但是还能塞点东西的硬盘. 如果您想要永久更改 Conda 的默认环境路径&#xff0c;可以编辑 Conda 的配置文件。首先&#xff0c;找到 Conda 的配置文件通常是 .condarc 文…

windows应用软件扫描报告 不告谱 要钱

chatGPT开路&#xff0c;帮找。 当你想要查找Windows软件的漏洞而不涉及查看源代码时&#xff0c;你可以使用一些专门设计用于扫描漏洞的工具。这些工具通常会检查已安装的软件和操作系统的漏洞&#xff0c;并提供建议或修补程序。以下是一些可以用于查找Windows软件漏洞的工具…

逻辑斯蒂回归

逻辑斯蒂回归 使用回归可以进行分类&#xff0c;&#xff0c;需要使用sigmod函数&#xff0c;将实数压缩到0-1之间的一个数&#xff0c;表示类别的概率&#xff0c;不像归一化函数会出现0或者1的数 逻辑回归就是线性回归进行sigmod函数处理&#xff0c;将预测结果变成0-1的数&…

数据结构之顺序表详解

hello&#xff0c;大家好&#xff0c;今天的内容是关于顺序表的&#xff0c;其实之前也发过文章&#xff0c;但是那个时候水平还是差了一点&#xff0c;有些地方不是很详细&#xff0c;这次会把每个点都讲清楚&#xff0c;也当给自己在复习一遍。 顺序表在本质上就是数组&#…

实习日常的点点滴滴记录(代码冲突问题)------慢慢积累,厚积薄发(要学的东西还好多,加油!))(知识和实践的结合)

Git代码冲突解决&#xff1a; 1、为什么会产生代码冲突&#xff1f; 远程仓库的某个文件内容发生了修改&#xff0c;而本地没有及时进行pull拉取&#xff0c;那么就会导致本地的分支落后。当修改完本地代码再push到远程的时候&#xff0c;就会产生代码冲突。 2、如何避免产生代…

并行和并发有什么区别?

并行和并发 并行和并发最早其实描述的是 Java 并发编程里面的概念。他们强调的是 CPU 处理任务的能力。简单来说&#xff1a; 并发&#xff0c;就是同一个时刻&#xff0c;CPU 能够处理的任务数量&#xff0c;并且对于应用程序来说&#xff0c;不会出现卡顿现象。并行&#x…

系统架构设计师-第18章-安全架构设计理论与实践-软考学习笔记

安全架构概述 信息的可用性、元略性、机密性、可控性和不可抵赖性等安全保障显得尤为重要&#xff0c;而满足这些诉求&#xff0c;离不开好的架构设计. 信息安全面临的威胁 常见的安全威胁有以下几种. (1)信息泄露 (2) 破坏信息的元整性: 数据被非授极地进行增删、修改成破坏…