spring security不会根据角色过滤对资源的访问

时间:2014-03-08 03:45:15

标签: java spring spring-mvc spring-security

我正在使用spring security 3.1.4。由于某种原因,没有正确过滤资源访问。我的安全xml文件如下所示。

<http auto-config="true">
 <intercept-url pattern="/**" access="ROLE_USER"/>
 <intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
 ...
</http>

正如您所看到的,我想用此配置表达的是USER可以访问任何资源,除非他们正在访问映射到/ admin / something的资源。

当我以仅使用ROLE_USER的用户身份登录时(在数据库中验证,因为我使用的是jdbc-user-service),我仍然可以将浏览器指向

  

/ myapp / admin / default

并查看所有内容。

然后我将我的安全xml更改为如下所示。

<http auto-config="true">
 <intercept-url pattern="/**" access="ROLE_ADMIN"/>
 <intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
 ...
</http>

当我以具有ROLE_USER的用户身份登录时,我得到HTTP 403访问被拒绝。

我的问题是

  1. 怎么来/ admin / **(ROLE_ADMIN)不会覆盖/ **(ROLE_USER)?
  2. 哪个过滤器(或代码中的精确位置)对角色和资源进行实际检查?我看了看FilterSecurityInterceptor,但代码似乎只是传递对象。
  3. 我该如何解决这个问题?我必须为ROLE_USER定义/ user / **,为ROLE_ADMIN定义/ admin / **吗?看起来这是一个可能的解决方案。
  4. 感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

尝试将管理模式放在更通用的/ **模式之前。从文档(http://docs.spring.io/spring-security/site/docs/3.0.x/reference/core-web-filters.html)中,最具体的模式需要在模式列表中声明更高。

<http auto-config="true">
    <intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
    <intercept-url pattern="/**" access="ROLE_USER"/>   
 ...
</http>