Spring-security无法匹配“?参数”格式?

时间:2012-05-06 03:51:31

标签: spring spring-security spring-roo

我使用spring-security来保护我的网络,当我通过application <http>节点中的applicationContext-security.xml中的spring-roo生成的配置文件来学习它时:

 <intercept-url pattern="/userses?form" access="hasRole('ROLE_ADMIN')" />

这意味着当您想要创建Users对象时,首先需要登录才能获得ADMIN权限。但实际上它没有用。检查日志:

2012-05-06 11:39:11,250 [http-8088-7] DEBUG org.springframework.security.web.util.AntPathRequestMatcher - Checking match of request : '/userses'; against '/userses?form'

框架使用/ userses而不是/ userses?表单进行比较,认证过程因字符串不匹配而跳过。为了验证这一点,我还尝试了另一个网址:

<intercept-url pattern="/userses/abc" access="hasRole('ROLE_ADMIN')" />

我请求/ userses / abc,检测到用户未经授权,并移至/ login页面,检查日志:

2012-05-06 11:46:44,343 [http-8088-7] DEBUG org.springframework.security.web.util.AntPathRequestMatcher - Checking match of request : '/uesrses/abc'; against '/userses/abc'

所以我的问题是:没有spring-secure 3支持“?参数”模式或者我错过了一些配置来支持这个? PS:所有的代码都是由roo生成的,没有修改,也不知道为什么它不起作用。

2 个答案:

答案 0 :(得分:6)

默认情况下spring security使用ant样式匹配,但无法匹配参数。但是,正则表达式匹配可以匹配参数

尝试这样定义:

<http request-matcher="regex">
  <security:intercept-url pattern="\A/userses\?form.*\Z" access="hasRole('ROLE_ADMIN')" />
</http>

不知道为什么Roo不会自动执行此操作。似乎应该这样。

答案 1 :(得分:6)

该行为由正在使用的"request-matcher"定义。如文档所示,默认值为&#34; ant&#34;,表示使用AntPathRequestMatcher,另一种选择是&#34; regex&#34;,RegexRequestMatcher。 javadocs(链接)提供了有关匹配器的细节,包括前者与请求的匹配&#34; servletPath + pathInfo&#34;以及后者与其&#34; servletPath + pathInfo + queryString&的匹配#34;