Spring Security资源通配符冲突问题

原创 2017年01月03日 13:47:43

1 系统配置

使用数据库配置系统 资源-角色-用户

1 资源

资源a: /admin/*
资源b:/admin/admin!index.action

2 角色

超级管理员:role_super
普通管理员:role_normal

3 资源-角色

role_super拥有资源a
role_normal拥有资源b

2 期望效果

超级管理员能够访问所有以/admin/开头的资源(当然包括资源b),普通管理员只能访问首页:/admin/admin!index.action

3 问题描述

有的时候超级管理员不能访问资源b,但是能访问其它的/admin/开头的资源,普通管理员只能访问资源b。
而有的时候,普通管理员无法访问所有/admin/开头的资源(不能访问资源b),超级管理员能访问所有/admin/开头的资源。

4 源码跟踪

角色是否拥有对某个特定资源的访问权限,取决于以下两个投票器:

    <bean id="accessDecisionManager" class="org.springframework.security.vote.AffirmativeBased">
        <property name="decisionVoters">
            <list>
                <bean class="org.springframework.security.vote.RoleVoter" />
                <bean class="org.springframework.security.vote.AuthenticatedVoter" />
            </list>
        </property>
    </bean>

角色投票器:

org.springframework.security.vote.RoleVoter

public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config) {
    int result = ACCESS_ABSTAIN;
    Iterator iter = config.getConfigAttributes().iterator();
    GrantedAuthority[] authorities = extractAuthorities(authentication);        

    while (iter.hasNext()) {
        ConfigAttribute attribute = (ConfigAttribute) iter.next();

        if (this.supports(attribute)) {
            result = ACCESS_DENIED;

            // Attempt to find a matching granted authority
            for (int i = 0; i < authorities.length; i++) {
                if (attribute.getAttribute().equals(authorities[i].getAuthority())) {
                    return ACCESS_GRANTED;
                }
            }
        }
    }

    return result;
}

    public boolean supports(ConfigAttribute attribute) {
        if ((attribute.getAttribute() != null) && attribute.getAttribute().startsWith(getRolePrefix())) {
            return true;
        }
        else {
            return false;
        }
    }

简单的观察代码运行此处的三个变量值:
authentication:当前用户的认证信息
org.springframework.security.providers.UsernamePasswordAuthenticationToken@da7bc0ad: Principal: cc.jiuyi.entity.Admin@617667eb; Password: [PROTECTED]; Authenticated: true; Details: org.springframework.security.ui.WebAuthenticationDetails@380f4: RemoteIpAddress: 127.0.0.1; SessionId: 79F021F693F49C844524B5EECC9B2D08; Granted Authorities: ROLE_NORMAL
object:想要访问的资源
FilterInvocation: URL: /admin/admin!index.action
config:拥有该资源的角色组
[ROLE_ADMIN]
结合代码逻辑,角色投票器的主要作用:
如果没有任何角色拥有该资源,或者所有角色都不是有效角色名,则投弃权票;
否则将用户的角色和角色组一一比对,如果都不匹配,投反对票,若存在匹配,则投赞成票。

5 原因分析

在期望效果中,我希望的逻辑是:
role_super 拥有 admin/*,以及/admin/admin!index.action权限
role_normal 拥有 /admin/admin!index.action权限
但是在spring security的代码中判断逻辑是:
/admin/admin!index.action资源的所属角色有[ROLE_ADMIN]
/admin/admin!index.action资源不是明确赋予了[ROLE_NORMAL]吗?
到这一步,我就没有再细看源码了。猜测的原因是,/admin/admin!index.action匹配了通配符admin/*,spring security就将/admin/admin!index.action这个资源划分到[ROLE_ADMIN],并停止了为它寻找其它的所属。
当然,在下一次启动的时候,/admin/admin!index.action资源的所属角色可能变成了[ROLE_NORMAL]

版权声明:本文为博主原创文章,转载需注明出处。

struts2 action 配置方法

struts2 action几乎完全吸收了xwork 的精华,近日学习struts 2,总结一下action的配制方法。首先看一下com.opensymphony.xwork2.Action的接口声明...
  • lianghyan
  • lianghyan
  • 2007年08月22日 16:09
  • 6318

springBoot+springSecurity 数据库动态管理用户、角色、权限(二)

序: 本文使用springboot+mybatis+SpringSecurity 实现数据库动态的管理用户、角色、权限管理本文细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义滤...
  • u012373815
  • u012373815
  • 2017年01月20日 18:47
  • 31518

Spring boot+Spring Security 4配置整合实例

本例所覆盖的内容: 1. 使用Spring Security管理用户身份认证、登录退出 2. 用户密码加密及验证 3. 采用数据库的方式实现Spring Security的remember-me功能 ...
  • code__code
  • code__code
  • 2016年12月26日 13:47
  • 42583

【spring-security】spring-security4安全框架配置详解

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring I...
  • u013412066
  • u013412066
  • 2016年02月15日 13:46
  • 37084

spring security四种实现方式

spring security实现方式大致可以分为这几种:     1.配置文件实现,只需要在配置文件中指定拦截的url所需要权限、配置userDetailsService指定用户名、密码、对应权限,...
  • bao19901210
  • bao19901210
  • 2016年09月18日 17:37
  • 31474

Spring Security资源配置入门讲解

 这是我使用的表结构 表名:RESOURCE 解释:资源表 备注: 资源表 RESOURCE(资源表) 是否主键 字段名 字段描述...
  • shuangyidehudie
  • shuangyidehudie
  • 2014年11月24日 14:42
  • 1169

Spring security 用户,角色,权限,资源

关于Spring security对用户请求的处理过程 体现在这两个过程的体现。 关于用户,角色,权限,资源的概念。用户:应用系统的使用者;角色:区分用户职能;权限:描述访...
  • wybqq
  • wybqq
  • 2016年10月27日 00:14
  • 1412

【Spring4揭秘 基础5】BeanDefinition及读取、注册

一、 BeanDefinition及其实现类BeanDefinition接口这个接口描述bean的结构,对应XML中的< bean >或者配置类中的@Bean 它集成了BeanMetadataEl...
  • u011179993
  • u011179993
  • 2016年06月06日 21:59
  • 6964

Spring security4.1.0 自定义角色和权限

文章大纲: 1.spring security 基本配置介绍 2.自定义角色和权限配置 3.跟着源码走一遍页面请求流程...
  • qq_25795665
  • qq_25795665
  • 2017年09月01日 14:21
  • 727

springMVC+mybatis+spring security<三>:使用数据库管理资源

spring security使用数据库来管理资源,分配权限后不用重启项目实现动态刷新
  • u010020611
  • u010020611
  • 2015年05月26日 13:34
  • 1483
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Security资源通配符冲突问题
举报原因:
原因补充:

(最多只允许输入30个字)