- 浏览: 193804 次
- 性别:
- 来自: 南京
文章分类
最新评论
前言
本文将详细探讨spring security中的鉴权操作,包括AbstractSecurityInterceptor的不同实现,后面章节还会讨论更加精确的域对象访问控制。
1.架构
1.1 组件之Authorities
在核心组件章节,我们知道认证后的Authentication中都会存储一个GrantedAuthority列表,代表着当前认证用户所具有的权限信息。在鉴权阶段AccessDecisionManager从Authentication中读取到这个列表,并据此作出是否允许用户操作执行的判断。GrantedAuthority是一个接口,里面只有一个方法
通过这个方法,AccessDecisionManager能获取一个明确的代表权限信息的字符串,如果某个GrantedAuthority不能单纯的通过一个字符串来代表权限信息,这个GrantedAuthority应该被认为是一个“复合”权限,对应的getAuthority()方法必须返回null。
spring security为我们提供了一个GrantedAuthority的具体实现类:SimpleGrantedAuthority,这个类可以把用户设定的字符串转换成GrantedAuthority,spring security提供的各种AuthenticationProvider都是用SimpleGrantedAuthority这个类来组装Authentication的。
1.2 组件之AccessDecisionManager
spring security是通过拦截器来控制安全访问的,一个请求最终能否被执行是通过AccessDecisionManager类的decide来判断的。这个类是被AbstractSecurityInterceptor调用的,AccessDecisionManager接口包含下面三个方法
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接口的内容如下
具体的AccessDecisionVoter实现者vote方法返回一个int值,对应的具体值在AccessDecisionVoter中定义成了常量:ACCESS_ABSTAIN, ACCESS_DENIED , ACCESS_GRANTED,分别代表弃权、拒绝、同意。
具体的AccessDecisionManager实现类有三个
我们也可以通过自定义实现AccessDecisionManager,例如可以对各种投票的结果追加权重计算等。
1.4 组件之RoleVoter
实际应用中最常用AccessDecisionVoter的具体实现类是RoleVoter,以及有继承功能的RoleHierarchyVoter,这两个实现都是把配置属性单纯的当作角色名称,当用户有对应的角色权限时就投赞成票。
具体逻辑如下:
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
本文将详细探讨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
发表评论
-
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81581.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1340前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1801前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1236一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1131一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2060前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2344前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12421.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7900前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2386前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1225前言: 在实际应用中 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1470前言: 作为spring security的核心类,大多数 ... -
spring-security(十三)核心服务类
2018-02-18 16:46 1412前言: 在之前的篇章中我们已经讲述了spring secu ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2526前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1238前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2106前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 867前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2067前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 670前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
在压缩包文件`spring_gateway_security_webflux`中,可能包含了示例代码或配置文件,用于演示如何在Spring Cloud Gateway中集成Spring Security,实现统一登录认证鉴权。这些资源可以帮助开发者更快地理解和实践上述...
在本项目中,我们主要探讨的是如何在Spring Boot框架下集成JWT(JSON Web Tokens)以及Spring Security,同时利用Redis作为存储来实现API的鉴权功能。这是一个完整的安全认证解决方案,适用于构建RESTful API服务。 ...
然而,正如标题所提及的,Spring Security 的源码可能存在鉴权缺陷。这个话题涉及到多个知识点,包括Spring Security的基本架构、鉴权流程、潜在的安全风险以及如何修复这些问题。 1. **Spring Security 基本架构**...
本项目"Spring security+jwt服务鉴权完整代码.zip"是基于Spring Security实现的JWT身份验证服务。主要包含了以下关键知识点: 1. **JWT令牌生成与验证**:JWT由三部分组成:头部(Header)、负载(Payload)和签名...
分布式系统的认证和授权 分布式架构采用 Spring Cloud Alibaba 认证和授权采用 Spring Security OAuth2.0 实现方法级权限控制 网关采用 gateway 中间件 服务注册和发现采用 nacos
在本文中,我们将深入探讨如何使用SpringBoot与SpringSecurity及JWT(JSON Web Token)结合,以实现登录鉴权功能。SpringBoot因其简化配置和与其他框架的无缝集成,成为了开发小型应用的理想选择。前后端分离的架构...
本教程将探讨如何使用Spring Boot结合Spring Security、OAuth2和JWT(JSON Web Token)来搭建一个认证服务器、API网关以及微服务之间的权限认证和授权机制。 首先,Spring Security是Spring框架的一个模块,专门...
本示例"springboot-springsecurity-demo"就是基于这两个组件的深度整合,旨在帮助开发者理解如何在Spring Boot项目中实现安全控制。 首先,让我们来看看核心文件`pom.xml`。这是Maven项目的配置文件,用于管理项目...
在这个“springboot springsecurity动态权限控制”的主题中,我们将深入探讨如何在Spring Boot项目中集成Spring Security,实现动态权限控制,让菜单权限的管理更加灵活和高效。 首先,我们需要理解Spring Security...
"renren-security轻量级权限管理系统 v5.3.0.zip" 是一个包含全面权限管理功能的软件包,主要用于帮助开发者构建安全、高效的企业级应用。这个系统以其轻量级和高可定制性为特点,提供了灵活的角色权限分配、用户...
在本项目"spring security http接口鉴权使用示范项目"中,我们将深入探讨如何利用Spring Security来实现HTTP接口的鉴权功能。这个项目旨在提供一个实践示例,帮助开发者理解并掌握Spring Security的核心概念和配置。...
在IT行业中,SpringBoot、SpringSecurity和WebSocket是三个非常重要的技术组件,它们分别在应用程序开发、安全管理和实时通信方面发挥着关键作用。本项目结合这三个技术,构建了一个整合的示例,旨在展示如何在...
在这个"spring security方法鉴权使用示范项目"中,我们将深入探讨如何利用Spring Security进行方法级别的权限控制。 首先,Spring Security 提供了基于注解的方法安全特性,这允许我们在方法级别定义哪些用户或者...
youlai-boot 是【有来开源组织】基于Spring Boot 3 + Spring Security 6 + JWT + Mybatis-Plus + Redis ...2. Spring Security + JWT 认证鉴权方案; 3. 基于 RBAC 模型的权限设计,细粒度接口方法、按钮级别权限控制。
在集成Spring Boot、Spring Cloud以及Spring Security、Spring OAuth2时,必须明确指定这些框架的具体版本号。这是因为不同版本间的API和配置可能会发生变化,如果不一致,可能会导致功能上的不兼容或异常行为。特别...
oauth2-family-barrel OAuth2全家桶 什么是oauth2-family-barrel ... OAuth2鉴权及授权服务中心以及客户端鉴权管理中心 使用OAuth2访问受保护资源的演示客户端 提供受保护资源的演示服务端 文件 其他……(待办事项)
在Spring Boot中,我们可以利用Spring Security来处理HTTP鉴权。Spring Security是一个功能强大的安全框架,它提供了多种安全控制,包括认证、授权、会话管理等。要启用Spring Security,我们需要在Maven工程的pom....
在本文中,我们将深入探讨如何使用Spring Boot和Spring Security实现基于基本身份验证(Basic Authentication)的安全RESTful API。Spring Boot简化了创建独立、生产级别的基于Spring的应用程序,并且Spring ...
springSecurity也有很多种权限认证方式,本项目主要实现基于接口授权,也就是说通过注解给controller赋予权限,用户只有拥有某个接口的权限才能成功访问这个接口,从而实现不同用户拥有不同访问权限;
Spring Cloud Gateway是Spring官方推出的第二代微服务网关,旨在替代 Zuul,其核心目标是简化API网关的开发和维护。它基于Spring Framework 5、Project Reactor和Spring Boot 2构建,支持高并发、低延迟的特性,...