spring security:拦截URL模式access =“#id == 1

我有项目是IAM Spring Security 3.1.3和MVC 3.2

我也希望在路径中的用户标识中匹配主用户标识的URL

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

http use-expressions将其设置为true,当尝试principal.userId == 1时可以使用,但是我需要使用从URL中提取的值。

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

回答:

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

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

为此,你需要:

1.添加扩展WebSecurityExpressionRoot的 CustomWebSecurityExpressionRoot

2.添加getIdUrlPathParameter()方法。它将有权访问HttpServletRequest对象。

3.定义CustomWebSecurityExpressionHandler,以扩展DefaultWebSecurityExpressionHandler。覆盖createSecurityExpressionRoot方法,然后在此处使用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>

以上是 spring security:拦截URL模式access =“#id == 1 的全部内容, 来源链接: utcz.com/qa/401094.html

回到顶部