403访问禁止错误 - 当url具有动态路径参数时弹簧安全性

时间:2015-08-06 11:39:53

标签: java spring authentication spring-security authorization

我的休息服务有一个名为USER的资源。 Follwing是这个资源的一部分。

/ api / users / {userId} / order / {orderId}
  / API /用户/ {用户id} / favoriteStores

我希望第一个URL受到保护,而第二个URL不需要安全性。(给出一个示例api urls)。

我按如下方式配置了安全配置

  <security:http pattern="/rest/users/**" entry-point-ref="restAuthenticationEntryPoint"
        use-expressions="true" auto-config="false" create-session="stateless">
        <security:custom-filter ref="authenticationTokenProcessingFilter"
            position="PRE_AUTH_FILTER" />
        <security:intercept-url pattern="/rest/users/{userId}/order/**"
            access="hasRole('ROLE_CUSTOMER')" />
        <security:logout />
    </security:http>

但这也拦截了第二个网址(这是/ api / users / {userId} / favoriteStores)

所以,我把配置改为

<security:http pattern="/rest/users/{userId}/order/**" entry-point-ref="restAuthenticationEntryPoint"
            use-expressions="true" auto-config="false" create-session="stateless">
            <security:custom-filter ref="authenticationTokenProcessingFilter"
                position="PRE_AUTH_FILTER" />
            <security:intercept-url pattern="/rest/users/{userId}/order/**"
                access="hasRole('ROLE_CUSTOMER')" />
            <security:logout />
        </security:http>

现在它显示禁止的错误。

我应该如何配置securit拦截网址?

2 个答案:

答案 0 :(得分:1)

在Spring安全性中,如果您不想拦截URL模式,则必须将访问值提供为permitAll。 URL模式也必须完全匹配您想要的。与你的例子中一样,如果你想允许url模式rest/users/{userId}/favoriteStores那么你必须添加这样的拦截模式:

<security:intercept-url pattern="/rest/users/*/favoriteStores/**"
                access="permitAll" />

有关详情,请访问弹簧链接for spring Expression-Based Access Control

答案 1 :(得分:0)

如果您根本不想拦截网址,可以直接执行

<http pattern="/rest/users/*/favoriteStores/**" security="none"/>