访问控制:
由于我们配置了访问控制(授权)的默认拦截器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方法是这样写的。
- public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) {
- int result = ACCESS_ABSTAIN;
- Collection<GrantedAuthority> authorities = extractAuthorities(authentication);
-
-
- for (ConfigAttribute attribute : attributes) {
- if (this.supports(attribute)) {
- result = ACCESS_DENIED;
-
-
-
- for (GrantedAuthority authority : authorities) {
- if (attribute.getAttribute().equals(authority.getAuthority())) {
- return ACCESS_GRANTED;
- }
- }
- }
- }
-
-
- return result;
- }
-
-
- Collection<GrantedAuthority> extractAuthorities(Authentication authentication) {
- return authentication.getAuthorities();
- }
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对象。
分享到:
相关推荐
主要介绍了Spring Security OAuth2认证授权示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
springsecurity使用配置详解,压缩包里包含主要的代码和详细的word文件说明。
SpringSecurity课程文档下载 pdf 教学
主要介绍了Spring Security UserDetails实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Spring Security基于json登录实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
JSP 开发之Spring Security详解 前言: spring Security是一个能够为基于Spring的企业应用系统提供描述性安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC...
Spring Security 基本使用和配置代码,学习之后自己练习,
spring security 3.0.5中文详解 跟着解说一步一步的做,你将有很大的收获
Spring_Security详解,讲解Spring_Security常用的过滤器及配置。
主要介绍了Spring Security基于JWT实现SSO单点登录详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了Spring security实现记住我下次自动登录功能过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Spring Security实现不同接口安全策略方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Spring Security保护用户密码常用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
NULL 博文链接:https://gaojiewyh.iteye.com/blog/1152242
主要介绍了详解spring security 配置多个AuthenticationProvider ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要讲解如何配置spring security,这个是www.family168.com上的关于spring security讲解的网页版作成一个pdf版的.
主要介绍了详解spring security之httpSecurity使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了SpringBoot + Spring Security 基本使用及个性化登录配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了详解springSecurity之java配置篇,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧