【问题标题】:Multiple roles definition in Spring SecuritySpring Security 中的多角色定义
【发布时间】:2018-09-22 15:15:32
【问题描述】:

我在 Spring Security 4.2.5 中有以下角色定义:

<security:http>
    <security:intercept-url pattern="/api/doSomething*"
                            access="ROLE_SOMETHING_COMPLETELY_DIFFERENT,ROLE_ONE,ROLE_TWO"/>
    <security:form-login />
    <security:logout />
</security:http>

由于以下异常而无法加载上下文:

Caused by: java.lang.IllegalArgumentException: Failed to parse expression "ROLE_SOMETHING_COMPLETELY_DIFFERENT,ROLE_ONE,ROLE_TWO"
at org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource.processMap(ExpressionBasedFilterInvocationSecurityMetadataSource.java:84)
at org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource.<init>(ExpressionBasedFilterInvocationSecurityMetadataSource.java:53)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
... 79 more

我正在从 Spring Security 3.2 升级,上面提到的 sn-p 工作得很好。以下方法不起作用:

  • access="ROLE_SOMETHING_COMPLETELY_DIFFERENT,ROLE_ONE,ROLE_TWO"
  • access="ROLE_SOMETHING_COMPLETELY_DIFFERENT, ROLE_ONE, ROLE_TWO"
  • access='ROLE_SOMETHING_COMPLETELY_DIFFERENT,ROLE_ONE,ROLE_TWO'
  • access='ROLE_SOMETHING_COMPLETELY_DIFFERENT, ROLE_ONE, ROLE_TWO'

尽管如此,这是可行的:

access="hasAnyRole('ROLE_SOMETHING_COMPLETELY_DIFFERENT','ROLE_ONE','ROLE_TWO')

至少从我已经阅读的内容来看,在 Spring Security 文档中没有任何迹象表明 access 标记中的此类参数是不可解析的。反而有很多examples using the exact same syntax

我想在访问字段中保持相同的语法,因为项目的访问管理配置中有 很多

编辑:使用 4.3.15 Spring Core 版本。

【问题讨论】:

    标签: spring-security roles


    【解决方案1】:

    Spring Security 4.x 更改了 http 元素的 use-expressions 属性的默认值。见Migrating from Spring Security 3.x to 4.x (XML Configuration)

    6.2。迁移

    http@use-expressions 属性的默认值从 false 更改为 true。这意味着如果未显式配置 use-expression 属性,则需要更新配置。例如,如果使用 Spring Security 3.2.x 的应用程序包含类似于以下的配置:

    Spring Security 3.2.x 示例配置

    <http> 
      <intercept-url pattern="/login" access="ROLE_ANONYMOUS"/>
      <intercept-url pattern="/**" access="ROLE_USER"/>
      ...
    </http>
    

    请注意未提供 use-expressions 属性。如果已提供,则无需执行任何操作。 Spring Security 4.x 时需要将配置更新为类似于以下内容:

    迁移到 Spring Security 4 配置

    <http use-expressions="false"> 
      <intercept-url pattern="/login" access="ROLE_ANONYMOUS"/>
      <intercept-url pattern="/**" access="ROLE_USER"/>
      ...
    </http>
    

    我们明确提供了 use-expressions 属性。同样,如果已经提供了该属性,则无需执行任何操作。

    【讨论】:

    • 我刚刚注意到 3.2 上的控制流使用 DefaultFilterInvocationSecurityMetadataSource 解析 XML,而 4.2 使用 ExpressionBasedFilterInvocationSecurityMetadataSource 这证实了您的答案。非常感谢。这让我可以继续。
    猜你喜欢
    • 2011-07-21
    • 2022-01-10
    • 2015-08-15
    • 1970-01-01
    • 2019-12-19
    • 2017-05-18
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多