kno*_*oma 4 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"/>
Run Code Online (Sandbox Code Playgroud)
http use-expressions设置为true,当try principal.userId == 1时它可以工作,但我需要使用url中提取的值.
我已经尝试了所有可能的组合.
这是不可能的.但还有另一种方式.您可以定义自己的Web表达式,该表达式负责从URL中提取id参数.它可能看起来像这样:
<security:intercept-url pattern="/user/{id}/edit" access="getIdUrlPathParameter() == principal.userId"/>
Run Code Online (Sandbox Code Playgroud)
为此,您需要:
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>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2494 次 |
最近记录: |