春季安全性、尾随斜杠和 URL 中的点
我使用Spring Security 3.1.4来保护部署到Tomcat的Spring MVC 3.2.4应用程序。我有以下Spring Security配置:
<http auto-config="true" use-expressions="true">
<http-basic />
<logout ... />
<form-login ... />
<intercept-url pattern="/" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/login" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/under-construction" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/admin-task*" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMINISTRATOR')" />
<intercept-url pattern="/resources/**" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</http>
我注意到没有尾部斜杠的URL模式(例如,)与带有尾部斜杠的URL不匹配(例如,),反之亦然。换句话说,带有斜杠的URL和不带斜杠的相同URL被Spring Security视为两个不同的URL。可以使用两个安全规则来解决此问题:/about
/about/
<intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/about/" access="isAnonymous() or hasRole('ROLE_USER')" />
有没有更好的解决方案?
我知道这允许使用正则表达式定义URL模式,但是如果可能的话,我想避免任何不必要的复杂性。path-type="regex"
更新
正如Adam Gent所指出的,还有一个问题涉及带有点的URL:并且被Spring MVC视为相同的URL。但是,Spring Security将它们视为两个不同的URL。因此,可能需要多一个安全规则:/about.foo
/about
<intercept-url pattern="/about.*" .../>