这是不可能的。但还有另一种方式。您可以定义自己的 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>