【问题标题】:spring security:intercept-url pattern access="#id == 1spring security:intercept-url 模式访问="#id == 1
【发布时间】:2012-12-20 12:57:45
【问题描述】:

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

我也想允许路径中用户 ID 中的 url 与主体用户 ID 匹配

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

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

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

【问题讨论】:

标签: spring spring-mvc spring-security


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这个 cannot be done 带有 Spring Security。

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2013-06-04
      • 2017-12-24
      • 2015-02-23
      • 2011-03-12
      • 2011-07-11
      相关资源
      最近更新 更多