7

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

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 配置角色模式?

4

2 回答 2

6

一种解决方案是使用 Spring Security 对角色层次结构的内置支持,并指定一个APP_AUDITOR“包含”各个部门的审计员角色的通用角色。

另一种方法是创建您自己的改进角色 voter 以使用模式,因为现有实现仅执行简单的相等性测试。基于这个现有的类,应该很容易做一些模式匹配。一旦你有了它,你可以通过这种方式将自定义选民与安全基础设施连接起来:

<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>
于 2013-07-29T14:41:23.677 回答
3

作为一个选项,您可以切换您的 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')Web 安全表达式,如下所述

<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)方法的源代码来查看如何获得权限。然后你需要应用正则表达式模式匹配,仅此而已。希望这可以帮助。

于 2013-07-29T16:07:56.920 回答