spring security:intercept-url pattern access =“#id == 1

时间:2013-01-06 18:03:50

标签: spring spring-mvc spring-security

我的项目是iam spring security 3.1.3和mvc 3.2

我想要允许路径中的userid中的url wehen匹配主要用户ID

    <security:intercept-url pattern="/user/{id}/edit" access="#id == principal.userId"/>

http use-expressions它设置为true,当尝试principal.userId == 1时它可以工作,但我需要使用url中提取的值。

我已经尝试了所有可能的组合。

2 个答案:

答案 0 :(得分:6)

这是不可能的。但还有另一种方式。您可以定义自己的Web表达式,该表达式负责从URL中提取id参数。看起来可能是这样的:

<security:intercept-url pattern="/user/{id}/edit" access="getIdUrlPathParameter() == principal.userId"/>

为此,您需要:
1.添加扩展 WebSecurityExpressionRoot 的CustomWebSecurityExpressionRoot
2.添加getIdUrlPathParameter()方法。它将有权访问HttpServletRequest对象。
3.定义扩展 DefaultWebSecurityExpressionHandler 的CustomWebSecurityExpressionHandler。覆盖createSecurityExpressionRoot方法abd在此使用您的CustomWebSecurityExpressionRoot。
4.定义自定义访问决策管理器(xml如下)
5.通过access-decision-manager-ref属性

将其注入 http 元素
<security:http access-decision-manager-ref="customAccessDecisionManagerBean" >
    <security:intercept-url pattern="/user/{id}/edit" access="getIdUrlPathParameter() == principal.userId"/>
</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>

答案 1 :(得分:0)

这是cannot be done与Spring Security。

相关问题