在Spring Security角色中使用通配符

usr*_*ΛΩΝ 5 spring-security

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

APP_DEPARTMENT1_USER
APP_DEPARTMENT1_AUDITOR
APP_DEPARTMENT1_WHATEVER
APP_DEPARTMENT2_...
Run Code Online (Sandbox Code Playgroud)

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

我认为不支持通配符表达式,并且我不认为Spring EL表达式可能会有所帮助(或者我只是不够熟练)。

有什么方法可以在<intercept-url>标签内为Spring Security配置角色模式?

zag*_*gyi 6

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

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

<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>
Run Code Online (Sandbox Code Playgroud)