`

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)和签名...

    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框架的一个模块,专门...

    springboot-springsecurity-demo

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

    SpringBoot+SpringSecurity+WebSocket

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

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

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

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

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

    springboot springsecurity动态权限控制

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

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

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

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

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

    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....

    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 模型的权限设计,细粒度接口方法、按钮级别权限控制。

    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