在Spring Security角色中使用通配符

时间:2013-07-29 14:23:28

标签: spring-security

我的应用程序中有一个角色约定机制,每个角色都遵循以下语法:

APP_DEPARTMENT1_USER
APP_DEPARTMENT1_AUDITOR
APP_DEPARTMENT1_WHATEVER
APP_DEPARTMENT2_...

我想配置Spring安全性,以便允许所有与给定后缀匹配的角色被授予访问我的Web应用程序的一部分的权限。我盲目地尝试<intercept-url pattern="/secure/audit/**" access="APP_*_AUDITOR,APP_ADMINISTRATOR" />(其中APP_ADMINISTRATOR是我的默认管理员角色),但它没有用。当我以管理员身份登录时,我可以访问该页面,但当我尝试使用APP_DEPARTMENT1_AUDITOR的配置文件登录时,我无法访问该页面。

我认为不支持通配符表达式,我不相信Spring EL表达式可能会有所帮助(或者我只是不能掌握它们)。

有没有办法在<intercept-url>代码中为Spring Security配置角色模式?

2 个答案:

答案 0 :(得分:2)

一种解决方案可能是使用Spring Security对role hierarchies的内置支持,并指定一个通用APP_AUDITOR角色,“包括”各个部门的审核员角色。

另一种方法是创建一个可以使用模式的改进角色选民,因为现有实现只执行simple equality test。基于这个现有的类,应该很容易做一些模式匹配。一旦你有了这个,你就可以通过这种方式将自定义选民与安全基础设施连接起来:

<http access-decision-manager-ref="myAccessDecisionManager">
  ...
</http>

<bean id="myAccessDecisionManager"
    class="org.springframework.security.access.vote.AffirmativeBased">
  <constructor-arg name="decisionVoters">
      <list>
        <bean id="patternBasedRoleVoter" 
            class="com.example.PatternBasedRoleVoter"/>
        <bean id="authenticatedVoter"
            class="org.springframework.security.access.vote.AuthenticatedVoter"/>            
      </list>
  </constructor-arg>
</bean>

答案 1 :(得分:2)

作为一个选项,您可以切换conf以使用Web安全表达式,然后引入能够处理正则表达式输入的自定义Web安全表达式。切换到安全表达式:

<http use-expressions="true">
    <intercept-url pattern="/secure/audit/**" access="
        hasRole('APP_DEPARTMENT1_AUDITOR') 
        and hasRole('APP_DEPARTMENT2_AUDITOR') 
        or hasRole('APP_ADMINISTRATOR')" />

将自定义hasRegexRole('regex_input')网络安全表达式简介为described here

<http use-expressions="true">
    <intercept-url pattern="/secure/audit/**" access="
        hasRegexRole('APP_*_AUDITOR') 
        or hasRole('APP_ADMINISTRATOR')" />

您可以使用org.springframework.security.access.expression.SecurityExpressionRoot.hasRole(String role)方法的源代码来了解如何获得权限。然后你需要应用正则表达式模式匹配和所有。希望这会有所帮助。