使用Spring Security 3.1.3自定义SecurityExpressionRoot方法

ryb*_*ber 4 spring-security

我正在将我的Spring Security从3.1.0升级到3.1.3并遇到了一个破坏我的设置的更改.

我一直在使用自定义SecurityExpressionRoot来公开一个与intercept-url条目一起使用的方法.

 <http entry-point-ref="forbiddenAccessEntryPoint" use-expressions="true" create-session="never"
      access-decision-manager-ref="webAccessDecisionManager">

    <intercept-url pattern="/licenses*" access="hasProjectAuthority('LICENSES')"/>
Run Code Online (Sandbox Code Playgroud)

SecurityExpressionRoot通过自定义DefaultMethodSecurityExpressionHandler注入.

这在3.1.0中工作正常,但在升级到3.1.3后,Spring无法评估"hasProjectAuthority"方法:

EL1004E:(pos 0):方法调用:在org.springframework.security.web.access.expression.WebSecurityExpressionRoot类型中找不到方法hasProjectAuthority(java.lang.String)

这个搬家了吗?

Mak*_*das 7

  • 尝试将代码从自定义SecurityExpressionRoot移动到自定义WebSecurityExpressionRoot.
  • 确保通过DefaultWebSecurityExpressionHandler.createSecurityExpressionRoot将自定义WebSecurityExpressionRoot注入到WebExpressionVoter中

你的xml可能如下所示:

<security:http access-decision-manager-ref="customAccessDecisionManagerBean">
    ....
<security:http/>

<bean id="customWebSecurityExpressionHandler" class="com.domain.security.CustomWebSecurityExpressionHandler"/>
<bean id="customAccessDecisionManagerBean" class="org.springframework.security.access.vote.AffirmativeBased">
    <property name="decisionVoters">
        <list>
            <bean class="org.springframework.security.web.access.expression.WebExpressionVoter">
                <property name="expressionHandler" ref="customWebSecurityExpressionHandler" />
            </bean>
        </list>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

  • 您需要使用**DefaultWebSecurityExpressionHandler.createSecurityExpressionRoot**而不是DefaultMethodSecurityExpressionHandler.createSecurityExpressionRoot,因为您要保护URL,而不是方法调用 (4认同)