Web安全表达式中的路径变量,并设置/ users / {userId:\\ d +}

时间:2018-11-05 03:28:48

标签: spring-mvc spring-security spring-security-rest

spring security 4.1.3.RELEASE intercept-url request-matcher="mvc"

我尝试使用spring-security.xml通过request-matche="mvc"配置我的网络安全性,但是模式“ / users / {userId:id}”无效。

我的配置就像下面的代码:

<http entry-point-ref="myAuthenticationEntryPoint" auto-config="true" use-expressions="true" create-session="stateless" request-matcher="mvc" 
      access-decision-manager-ref="myAccessDecisionManager">
    <intercept-url pattern="/users/{userId:\\d+}" method="GET" access="@webSecurity.isMe(authentication, #userId) or hasAnyRole('ADMIN')"/>
    <intercept-url pattern="/users/management" method="GET" access="hasAnyRole('ADMIN')"/>
</http>

我希望/ users / 12345的请求将匹配模式/ users / {userId:\ d +},它将与12345匹配到userId,并且/ users / management的请求将匹配模式/ users / management 。但是,实际上,模式/ users / {userId:\ d +}无效,它永远不会匹配请求/ users / 12345。并将设置更改为以下代码:

<http entry-point-ref="myAuthenticationEntryPoint" auto-config="true" use-expressions="true" create-session="stateless" request-matcher="mvc" 
      access-decision-manager-ref="myAccessDecisionManager">
    <intercept-url pattern="/users/{userId}" method="GET" access="@webSecurity.isMe(authentication, #userId) or hasAnyRole('ADMIN')"/>
    <intercept-url pattern="/users/management" method="GET" access="hasAnyRole('ADMIN')"/>
</http>

从/ users / {userId:\ d +}中删除:\ d +,它将匹配对/ users / 12345的请求。但是它也将匹配对/ users / management的请求,这使userId的值等于意外的“ management”。我尝试使用ant-matcher和regex-matcher,但是找不到理想的解决方案中的userId。

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。这是一个愚蠢的错误。要解决该问题,我只需要用/users/{userId:\\d+}/users/{userId:\d+}替换/users/{userId:[0-9]+}并使用AntPathMatcher而不是MvcPathMatcher。使用spring-security.xml配置安全性与使用javaConfig或使用注释不同。在javaConfig或批注@RequestMapping中,""中的内容是字符串对象,因此我们需要另一个\来转义\d+。但是在xml中,这是不必要的。如果在这里使用\\d+,Spring Security会将其附加到\\\\d+,它将永远不会与数字类型字符串匹配。当我在org.springframework.util.AntPathMatcher.matchStrings(String str, Map<String, String> uriTemplateVariables)中设置一个断点并观察请求时,我找到了这种解决方案。