`

spring-security(二十五)鉴权

阅读更多
前言
  本文将详细探讨spring security中的鉴权操作,包括AbstractSecurityInterceptor的不同实现,后面章节还会讨论更加精确的域对象访问控制。
1.架构
1.1 组件之Authorities
核心组件章节,我们知道认证后的Authentication中都会存储一个GrantedAuthority列表,代表着当前认证用户所具有的权限信息。在鉴权阶段AccessDecisionManager从Authentication中读取到这个列表,并据此作出是否允许用户操作执行的判断。GrantedAuthority是一个接口,里面只有一个方法
String getAuthority();

通过这个方法,AccessDecisionManager能获取一个明确的代表权限信息的字符串,如果某个GrantedAuthority不能单纯的通过一个字符串来代表权限信息,这个GrantedAuthority应该被认为是一个“复合”权限,对应的getAuthority()方法必须返回null。
spring security为我们提供了一个GrantedAuthority的具体实现类:SimpleGrantedAuthority,这个类可以把用户设定的字符串转换成GrantedAuthority,spring security提供的各种AuthenticationProvider都是用SimpleGrantedAuthority这个类来组装Authentication的。
1.2 组件之AccessDecisionManager
spring security是通过拦截器来控制安全访问的,一个请求最终能否被执行是通过AccessDecisionManager类的decide来判断的。这个类是被AbstractSecurityInterceptor调用的,AccessDecisionManager接口包含下面三个方法
void decide(Authentication authentication, Object secureObject, Collection<ConfigAttribute> attrs) throws AccessDeniedException;
boolean supports(ConfigAttribute attribute); 
boolean supports(Class clazz);

AccessDecisionManager的decide方法会传入所有做出决定所需的信息。通常情况下,通过传入的安全对象,我们就可以获取到大部分所需的参数信息,例如:假定传入的对象是MethodInvocation,可以很容易的通过MethodInvocation获取任意的自定义参数,然后通过AccessDecisionManager中的判断逻辑来确保当前用户是可以针对这些参数执行操作的,如果不允许,应该抛出AccessDeniedException异常。
在应用启动时AbstractSecurityInterceptor会调用AccessDecisionManager的supports(ConfigAttribute)方法来检查当前的ConfigAttribute是否能被对应的Interceptor支持,如FilterSecurityInterceptor支持FilterInvocationSecurityMetadataSource对应的ConfigAttribute,MethodSecurityInterceptor支持MethodSecurityMetadataSource对应的ConfigAttribute。
supports(Class)用来判断当前Interceptor是否支持对应的Security object对象。
1.3 基于投票机制的AccessDecisionManager实现
尽管用户可以实现自己的AccessDecisionManager来控制鉴权的所有处理,为了方便,spring security也提供了几种基于投票机制的AccessDecisionManager实现,相关类关系如下:



从上图可以看出,AccessDecisionManager就是利用各种各样的AccessDecisionVoter的投票结果来做最后的决定的。AccessDecisionVoter接口的内容如下
int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attrs); 
boolean supports(ConfigAttribute attribute);
boolean supports(Class clazz);

具体的AccessDecisionVoter实现者vote方法返回一个int值,对应的具体值在AccessDecisionVoter中定义成了常量:ACCESS_ABSTAIN, ACCESS_DENIED , ACCESS_GRANTED,分别代表弃权、拒绝、同意。
具体的AccessDecisionManager实现类有三个
  • ConsensusBased 统计所有的投票结果,如果赞成大于反对旧赞成,如果发对大于赞成就抛异常,如果赞成和反对一样多,就看配置的allowIfEqualGrantedDeniedDecisions属性值,true的话就赞成,false就抛异常。
  • AffirmativeBased(默认)只要有赞成的投票就赞成,如果所有的投票结果都没有赞成,并且有反对的票就抛出异常,否则就是所有的投票结果都是弃权,也是看看配置的allowIfEqualGrantedDeniedDecisions属性值,true的话就赞成,false就抛异常
  • UnanimousBased 只要有反对的票就抛出异常,如果没有反对票并且有赞成票,也认为是赞成,否则就是所有的投票结果都是弃权,也是看看配置的allowIfEqualGrantedDeniedDecisions属性值,true的话就赞成,false就抛异常

我们也可以通过自定义实现AccessDecisionManager,例如可以对各种投票的结果追加权重计算等。
1.4 组件之RoleVoter
实际应用中最常用AccessDecisionVoter的具体实现类是RoleVoter,以及有继承功能的RoleHierarchyVoter,这两个实现都是把配置属性单纯的当作角色名称,当用户有对应的角色权限时就投赞成票。
具体逻辑如下:
  • 当一个安全对象对应的ConfigAttribute以ROLE_开头,则进行投票,否则就弃权
  • 获取当前认证对象authentication中的权限列表,权限列表里面有和ConfigAttribute.getAttribute()返回值相同的权限时就赞成,否则投拒绝票

1.5 组件之AuthenticatedVoter
不同于RoleVoter,这个实现类会根据当前的认证类型进行投票,主要用来区分匿名认证、remember-me认证、fully-authenticated认证。这种鉴权方式主要用在那种对remember-me认证有特殊访问限制的系统中
1.6 调用完后处理(After Invocation Handling)
AccessDecisionManager是AbstractSecurityInterceptor在执行安全对象之前进行调用的,没有权限抛出异常,从而用户限制调用。实际应用中,有的系统可能会希望在调用完成后再对返回结果进行修改,当然,借助spring aop,我们自己也能实现相应的逻辑,spring security给我们提供了更加便捷和ACL进行继承的默认实现,相关联的类如下:



核心类是AfterInvocationManager,在调用完安全对象(FilterInvocation)后,会调用这个类的decide方法,具体的实现类是AfterInvocationProviderManager,里面有一个AfterInvocationProvider列表,每一个AfterInvocationProvider要么修改一下的结果,要么抛出异常。
1.7 继承角色
具体例子参考java config-sample之rolehierarchy
  • 大小: 36.7 KB
  • 大小: 24.4 KB
分享到:
评论

相关推荐

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    在压缩包文件`spring_gateway_security_webflux`中,可能包含了示例代码或配置文件,用于演示如何在Spring Cloud Gateway中集成Spring Security,实现统一登录认证鉴权。这些资源可以帮助开发者更快地理解和实践上述...

    springboot+jwt+spring-security.rar

    在本项目中,我们主要探讨的是如何在Spring Boot框架下集成JWT(JSON Web Tokens)以及Spring Security,同时利用Redis作为存储来实现API的鉴权功能。这是一个完整的安全认证解决方案,适用于构建RESTful API服务。 ...

    springsecurity源码(鉴权有缺陷)

    然而,正如标题所提及的,Spring Security 的源码可能存在鉴权缺陷。这个话题涉及到多个知识点,包括Spring Security的基本架构、鉴权流程、潜在的安全风险以及如何修复这些问题。 1. **Spring Security 基本架构**...

    Spring security+jwt服务鉴权完整代码.zip

    本项目"Spring security+jwt服务鉴权完整代码.zip"是基于Spring Security实现的JWT身份验证服务。主要包含了以下关键知识点: 1. **JWT令牌生成与验证**:JWT由三部分组成:头部(Header)、负载(Payload)和签名...

    Spring Cloud Alibaba 集成 Spring Security OAuth2.0 实现认证和授权

    分布式系统的认证和授权 分布式架构采用 Spring Cloud Alibaba 认证和授权采用 Spring Security OAuth2.0 实现方法级权限控制 网关采用 gateway 中间件 服务注册和发现采用 nacos

    SpringBoot集成SpringSecurity和JWT做登陆鉴权的实现

    在本文中,我们将深入探讨如何使用SpringBoot与SpringSecurity及JWT(JSON Web Token)结合,以实现登录鉴权功能。SpringBoot因其简化配置和与其他框架的无缝集成,成为了开发小型应用的理想选择。前后端分离的架构...

    Springboot整合Spring security+Oauth2+JWT搭建认证服务器,网关,微服务之间权限认证及授权

    本教程将探讨如何使用Spring Boot结合Spring Security、OAuth2和JWT(JSON Web Token)来搭建一个认证服务器、API网关以及微服务之间的权限认证和授权机制。 首先,Spring Security是Spring框架的一个模块,专门...

    renren-security轻量级权限管理系统 v5.3.0.zip

    "renren-security轻量级权限管理系统 v5.3.0.zip" 是一个包含全面权限管理功能的软件包,主要用于帮助开发者构建安全、高效的企业级应用。这个系统以其轻量级和高可定制性为特点,提供了灵活的角色权限分配、用户...

    springboot-springsecurity-demo

    本示例"springboot-springsecurity-demo"就是基于这两个组件的深度整合,旨在帮助开发者理解如何在Spring Boot项目中实现安全控制。 首先,让我们来看看核心文件`pom.xml`。这是Maven项目的配置文件,用于管理项目...

    springboot springsecurity动态权限控制

    在这个“springboot springsecurity动态权限控制”的主题中,我们将深入探讨如何在Spring Boot项目中集成Spring Security,实现动态权限控制,让菜单权限的管理更加灵活和高效。 首先,我们需要理解Spring Security...

    spring security http接口鉴权使用示范项目

    在本项目"spring security http接口鉴权使用示范项目"中,我们将深入探讨如何利用Spring Security来实现HTTP接口的鉴权功能。这个项目旨在提供一个实践示例,帮助开发者理解并掌握Spring Security的核心概念和配置。...

    SpringBoot+SpringSecurity+WebSocket

    在IT行业中,SpringBoot、SpringSecurity和WebSocket是三个非常重要的技术组件,它们分别在应用程序开发、安全管理和实时通信方面发挥着关键作用。本项目结合这三个技术,构建了一个整合的示例,旨在展示如何在...

    spring security方法鉴权使用示范项目

    在这个"spring security方法鉴权使用示范项目"中,我们将深入探讨如何利用Spring Security进行方法级别的权限控制。 首先,Spring Security 提供了基于注解的方法安全特性,这允许我们在方法级别定义哪些用户或者...

    youlai-boot: Spring Boot 3 + Spring Security + Vue3 权限管理系统

    youlai-boot 是【有来开源组织】基于Spring Boot 3 + Spring Security 6 + JWT + Mybatis-Plus + Redis ...2. Spring Security + JWT 认证鉴权方案; 3. 基于 RBAC 模型的权限设计,细粒度接口方法、按钮级别权限控制。

    springcloud微服务里的oauth2集成总结.docx

    在集成Spring Boot、Spring Cloud以及Spring Security、Spring OAuth2时,必须明确指定这些框架的具体版本号。这是因为不同版本间的API和配置可能会发生变化,如果不一致,可能会导致功能上的不兼容或异常行为。特别...

    oauth2-family-barrel:OAuth2全家桶项目。本项目演示了如何使用spring-boot,spring-security以及spring-security-oauth快速构建OAuth2服务框架体系

    oauth2-family-barrel OAuth2全家桶 什么是oauth2-family-barrel ... OAuth2鉴权及授权服务中心以及客户端鉴权管理中心 使用OAuth2访问受保护资源的演示客户端 提供受保护资源的演示服务端 文件 其他……(待办事项)

    java http鉴权(spring boot 工程)

    在Spring Boot中,我们可以利用Spring Security来处理HTTP鉴权。Spring Security是一个功能强大的安全框架,它提供了多种安全控制,包括认证、授权、会话管理等。要启用Spring Security,我们需要在Maven工程的pom....

    spring-boot-basic-auth:使用基本身份验证的安全Spring Boot REST API

    在本文中,我们将深入探讨如何使用Spring Boot和Spring Security实现基于基本身份验证(Basic Authentication)的安全RESTful API。Spring Boot简化了创建独立、生产级别的基于Spring的应用程序,并且Spring ...

    基于springBoot+springSecurity+jwt实现前后端分离用户权限认证

    springSecurity也有很多种权限认证方式,本项目主要实现基于接口授权,也就是说通过注解给controller赋予权限,用户只有拥有某个接口的权限才能成功访问这个接口,从而实现不同用户拥有不同访问权限;

    spring-cloud-gateway-example-master.zip

    Spring Cloud Gateway是Spring官方推出的第二代微服务网关,旨在替代 Zuul,其核心目标是简化API网关的开发和维护。它基于Spring Framework 5、Project Reactor和Spring Boot 2构建,支持高并发、低延迟的特性,...

Global site tag (gtag.js) - Google Analytics