Spring安全请求块相互矛盾

时间:2012-04-29 15:57:25

标签: spring security

    <security:intercept-url pattern="/person/**" 
        access="isAuthenticated()" />   


    <security:intercept-url pattern="/person?reg"
        access="isAnonymous()" />

我希望过滤器拦截所有/ person / blabla等请求。 但是匿名用户应该有一个可以自己注册的。

每当我引入第一条规则时,所有子请求都会受到保护,包括底层请求不是必需的。

如果我不先介绍,则允许底部请求,但匿名用户也可以访问所有后续请求,例如/ person / myProfile。

1 个答案:

答案 0 :(得分:3)

来自Spring Security docs

  

您可以使用多个元素为不同的URL集定义不同的访问要求,但它们将按列出的顺序进行评估,并将使用第一个匹配项。所以你必须把最具体的比赛放在最上面。

此外,spring默认使用ant样式模式匹配,在尝试匹配时不包括参数。您还希望匹配参数是否存在。为此,您需要通过regex matching上的request-matcher属性设置http

<http request-matcher="regex">
  <security:intercept-url pattern="\A/person\?reg.*\Z" access="isAnonymous()" />

  <security:intercept-url pattern="\A/person/.*\Z" access="isAuthenticated()" />
</http>