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。
答案 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)
中设置一个断点并观察请求时,我找到了这种解决方案。