`
kobe学java
  • 浏览: 258477 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Spring Security 3 基于角色访问控制过程详解

 
阅读更多

访问控制:

由于我们配置了访问控制(授权)的默认拦截器org.springframework.security.web.access.intercept.FilterSecurityInterceptor。其主要业务方法是InterceptorStatusToken beforeInvocation(Object object)


该方法会将URL传给SecurityMetadataSource获取匹配该URL所有参数ConfigAttribute(拥有权限的角色)的集合。


如果该用户尚未认证(登录),或拦截器配置了“始终认证”,则拦截器会将该用户的登录信息(未登录则跳转到登陆页面)重新认证,并加载角色信息。


随后将用户认证信息(Authentication),用户请求访问的URL,以及配置集合(Collection<ConfigAttribute>)交由accessDecisionManager的decide方法。通过则方法继续,否则抛出AccessDeniedException。


调用runAsManager尝试转换认证信息,这是为了方便适应两层访问控制架构。runAsManager就可以将外部公开的认证,转换为内部认证,继续之后的访问。


之后返回包含访问拦截信息的对象InterceptorStatusToken。以便afterInvocation(InterceptorStatusToken, Object)方法运行。


安全信息元数据提供者:


默认实现DefaultFilterInvocationSecurityMetadataSource构造时通过addSecureUrl(String pattern, String method, Collection<ConfigAttribute> attrs)方法将传入参数转换为私有成员变量Map<String, Map<Object, Collection<ConfigAttribute>>> httpMethodMap缓存,并通过Collection<ConfigAttribute> lookupAttributes(String url, String method)获得第一个能匹配的上的URL模式,并返回其所需要的角色集合Collection<ConfigAttribute>

访问控制管理者:


访问控制管理者AccessDecisionManager需要投票者AccessDecisionVoter列表,调用后者的vote方法。而前者则负责统计所有投票者的投票情况,并做出是否授权的决定。而框架提供了三个统计策略,分别是“只要有一个投票者同意即同意”,“需要所有投票者同意才同意”,“少数服从多数”。分别对应着

AbstractAccessDecisionManager的三个子类AffirmativeBased, UnanimousBased,ConsensusBased。

 

基于角色的投票者


RoleVoter实现了AccessDecisionVoter接口,其vote方法是这样写的。

[java] view plaincopy
  1. public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) {  
  2.         int result = ACCESS_ABSTAIN;  
  3.         Collection<GrantedAuthority> authorities = extractAuthorities(authentication);  
  4.   
  5.   
  6.         for (ConfigAttribute attribute : attributes) {  
  7.             if (this.supports(attribute)) {  
  8.                 result = ACCESS_DENIED;  
  9.   
  10.   
  11.                 // 查找匹配角色  
  12.                 for (GrantedAuthority authority : authorities) {  
  13.                     if (attribute.getAttribute().equals(authority.getAuthority())) {  
  14.                         return ACCESS_GRANTED;  
  15.                     }  
  16.                 }  
  17.             }  
  18.         }  
  19.   
  20.   
  21.         return result;  
  22.     }  
  23.   
  24.   
  25. Collection<GrantedAuthority> extractAuthorities(Authentication authentication) {  
  26.         return authentication.getAuthorities();  
  27.     }  





ps:DefaultFilterInvocationSecurityMetadataSource初始化过程详解


Spring Security 3 访问验证模块的初始化,主要是FilterInvocationSecurityMetadataSource对象加载配置信息的过程。

而FilterInvocationSecurityMetadataSource的实现,我选用了框架提供的默认实现DefaultFilterInvocationSecurityMetadataSource。

在DefaultFilterInvocationSecurityMetadataSource 构造的时候,需要UrlMatcher和LinkedHashMap<RequestKey, Collection<ConfigAttribute>>两个参数。
前者是解析Url的匹配器,框架提供两种选择:一个是AntUrlPathMatcher,另一个是正则匹配。当然也可以自己写,只要实现UrlMatcher接口就行。
第二个参数需要提供 所有的请求URL模板,与其对应所有的配置属性(在RBAC系统中即为“角色码”)。

例如:RequestKey为 /user!add**, Collection<ConfigAttribute>为[ROLE_HR, ROLE_ADMIN]。就是说,能有权限访问用户添加模块的角色为HR,和管理员。


在DefaultFilterInvocationSecurityMetadataSource 的构造方法当中,其通过addSecureUrl(String pattern, String method, Collection<ConfigAttribute> attrs)方法将传入参数转换为私有成员变量Map<String, Map<Object, Collection<ConfigAttribute>>> httpMethodMap;
key是Http方法:主要“GET”"和POST",Value是Key的HTTP方法对应的配置属性集合。key为null时,value为不特定方法的配置属性集合。而Value也是一个Map,它的主键是编译后的URL模板,值为各种角色的ConfigAttribute对象。

 

分享到:
评论

相关推荐

    springsecurity使用配置详解

    Spring Security支持基于角色的访问控制(RBAC)、表达式语言(Expression-Based Access Control, SpEL)和访问决策管理器(Access Decision Manager)。你可以通过定义访问规则,如`@Secured`、`@PreAuthorize`或`@...

    Spring Security 3多用户登录实现一

    **Spring Security 3 多用户登录实现详解** Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛应用于Java EE平台上的安全解决方案。在本文中,我们将深入探讨如何在Spring Security 3中实现...

    Spring Security OAuth2认证授权示例详解

    Spring Security OAuth2是一个强大的安全框架,它为Web应用程序提供了安全认证和授权的功能。OAuth2则是一种开放标准,允许用户授权第三方应用访问他们存储在另一服务提供商的数据,而无需分享他们的用户名和密码。...

    Spring Security UserDetails实现原理详解

    Spring Security 是一个强大的安全框架,用于管理Web应用的认证和授权。在Spring Security中,`UserDetails` 是一个核心概念,它代表了系统的用户信息。本文将深入探讨`UserDetails`的实现原理,并通过示例代码进行...

    SpringSecurity课程文档下载 pdf 教学

    SpringSecurity课程文档下载 pdf 教学

    springsecurity入门实例

    1. **访问控制**:Spring Security 提供了基于角色的访问控制(RBAC),允许开发者定义哪些用户或角色可以访问哪些资源。 2. **身份验证**:Spring Security 提供了多种身份验证机制,如用户名/密码、OAuth2、JWT ...

    spring-security3 入门篇

    Spring Security支持基于角色的访问控制(RBAC)和访问决策管理器(Access Decision Manager)等策略。 - **Filter Chain(过滤器链)**: Spring Security通过一系列Web安全过滤器来保护HTTP请求,这些过滤器按照...

    spring security 3.0.5中文详解

    ### Spring Security 3.0.5中文详解 #### 一、Spring Security简介 Spring Security是一种基于Spring AOP和Servlet过滤器的安全框架,旨在为应用程序提供全面的安全性解决方案。该框架能够在Web请求级别和方法调用...

    spring security 培训ppt

    Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,主要为基于 Spring 的企业级应用程序提供声明式的安全服务。它不仅支持认证(Authentication)和授权(Authorization),还能帮助开发者保护 Web 和...

    Spring Security模块

    5. **权限检查**:`FilterSecurityInterceptor` 检查用户是否有权访问请求的资源,这涉及到 `AccessDecisionManager` 和访问控制策略(如 ACL 或基于角色的访问控制)。 6. **会话管理**:Spring Security 还可以...

    Spring Security学习总结一

    ### Spring Security核心概念与实践详解 #### Spring Security概述 在深入了解Spring Security之前,我们先回顾一下没有Spring Security的权限管理场景。在传统架构中,权限验证逻辑往往与业务逻辑紧密交织,导致...

    Spring Security3 配置使用

    4. **授权策略**:Spring Security支持基于角色的访问控制(RBAC),通过`access`属性定义权限表达式。例如,`hasRole('ROLE_ADMIN')`表示只有具有"ROLE_ADMIN"角色的用户才能访问。 5. **自定义组件**:Spring ...

    Spring Security 基本使用和配置代码

    Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,广泛用于构建安全的Java Web应用程序。本教程将深入探讨Spring Security的基本使用和配置代码,帮助你理解和实践这个框架。 首先,Spring ...

    SpringSecurity3框架

    Spring Security 提供了基于角色的访问控制(RBAC)、表达式语言(SpEL)以及访问决策管理器等授权方式。你可以使用 `@Secured` 或 `@PreAuthorize` 注解来指定方法级别的权限,或者通过配置 XML 来设置 URL 路径的...

    spring-security-3.1.0.RC3

    Spring Security支持基于角色的访问控制(RBAC),还可以通过访问决策管理器(Access Decision Manager)实现自定义策略。 4. **会话管理**:Spring Security提供了会话管理和会话固定防护,防止会话劫持和CSRF攻击...

    Spring Security 新手入门级maven实例

    **Spring Security新手入门级Maven实例...随着对Spring Security的深入学习,你将能够实现更复杂的场景,如OAuth2集成、记住我功能、CSRF防护、基于URL的访问控制等。不断实践和探索,你将成为Spring Security的专家。

    springboot项目——基于springSecurity实现的前后端分离的企业级人事管理系统

    《基于SpringSecurity的SpringBoot企业级人事管理系统详解》 在当今的互联网开发环境中,SpringBoot以其简洁、高效的特点,已经成为构建后端服务的主流框架。而SpringSecurity作为Spring生态系统中的安全组件,为...

    SpringBoot + Spring Security 基本使用及个性化登录配置详解

    SpringBoot + Spring Security 基本使用及个性化登录配置详解 Spring Security 是一个功能强大且灵活的安全框架,它提供了认证、授权、攻击防护等功能。SpringBoot 是一个基于 Spring 框架的框架,它提供了很多便捷...

    Spring Security基于json登录实现过程详解

    Spring Security是一种强大的、高度可定制的认证和访问控制框架,它是为了解决企业应用的安全需求而生。传统的Spring Security主要通过表单方式实现用户登录,但在现代的Web应用中,基于RESTful API的交互越来越多地...

    Spring_Security3中文指南.pdf

    ### Spring Security 3.0 入门与核心概念详解 #### 一、Spring Security简介 Spring Security 是一款功能强大且高度可定制的应用安全框架,它为基于 Java 的应用程序提供了全面的安全服务。尤其对于那些采用 ...

Global site tag (gtag.js) - Google Analytics