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方法是这样写的。
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对象。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Security是一个功能强大且灵活的身份验证和访问控制框架,用于保护基于Java的应用程序。它提供了一套全面的安全解决方案,可用于保护Web应用程序、RESTful API、方法级别的安全等。 Spring Security的核心原则是基于拦截器链(Filter Chain)的安全性,它通过一系列的过滤器(Filters)来处理不同的安全问题。这些过滤器可以在认证(Authentication)和授权(Authorization过程中执行各种任务。 在Spring Security中,认证是指验证用户的身份,通常通过用户名和密码进行验证。授权是指根据用户的身份和角色来确定其是否有权访问特定资源或执行特定操作。 Spring Security提供了许多功能和扩展点,可以轻松地自定义和扩展以满足特定的需求。以下是一些Spring Security的主要功能: 1. 身份验证(Authentication):Spring Security支持多种身份验证方式,如基于数据库、LDAP、OAuth等。它还提供了记住我(Remember Me)和匿名访问等功能。 2. 授权(Authorization):Spring Security支持基于角色和权限的授权机制。可以配置细粒度的访问控制规则,以确保只有具有合适权限的用户可以访问受保护的资源。 3. 安全性注解(Security Annotations):Spring Security提供了一套注解,可以在方法级别上标记安全性要求。这些注解可以用于限制对特定方法的访问,并进行细粒度的授权控制。 4. CSRF保护(CSRF Protection):Spring Security提供了一种防止跨站请求伪造(CSRF)攻击的机制。它通过生成和验证CSRF令牌来确保只有合法的请求才能被处理。 5. Session管理(Session Management):Spring Security提供了对会话管理的支持,包括会话过期、并发控制和无效会话处理等功能。 6. 安全事件与日志(Security Events and Logging):Spring Security可以生成安全相关的事件,并提供了灵活的日志配置选项,以便记录和监视应用程序的安全状态。 以上只是Spring Security的一些主要功能,它还有很多其他特性和扩展点可用于满足各种安全需求。要详细了解Spring Security的使用和配置,可以参考官方文档或其他相关资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值