Jer*_*Cai 7 spring spring-security spring-roo
当我通过在applicationContext-security.xml中的spring-roo生成的配置文件中学习它时,我使用spring-security来保护我的网络<http>:
<intercept-url pattern="/userses?form" access="hasRole('ROLE_ADMIN')" />
Run Code Online (Sandbox Code Playgroud)
这意味着当您要创建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'
Run Code Online (Sandbox Code Playgroud)
框架使用/ userses而不是/ userses?表单进行比较,认证过程因字符串不匹配而跳过.为了验证这一点,我还尝试了另一个网址:
<intercept-url pattern="/userses/abc" access="hasRole('ROLE_ADMIN')" />
Run Code Online (Sandbox Code Playgroud)
我请求/ 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'
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:没有spring-secure 3支持"?参数"模式或者我错过了配置来支持这个?PS:所有代码都是由roo生成的,没有修改,也不知道为什么它不起作用.
默认情况下,spring security使用ant样式匹配,这与参数不匹配.但是,正则表达式匹配可以匹配参数
尝试定义它:
<http request-matcher="regex">
<security:intercept-url pattern="\A/userses\?form.*\Z" access="hasRole('ROLE_ADMIN')" />
</http>
Run Code Online (Sandbox Code Playgroud)
不知道为什么Roo不会自动执行此操作.似乎应该这样.
该行为由使用中的"请求匹配器"定义.如文档所示,默认值为"ant",表示使用AntPathRequestMatcher,另一种选择是"regex",即RegexRequestMatcher.javadocs(链接)给出了有关匹配器的细节,包括前者与请求的"servletPath + pathInfo"匹配,后者与其"servletPath + pathInfo + queryString"匹配.