【发布时间】:2014-04-11 11:09:47
【问题描述】:
我正在使用 Spring Security 3.1.4。由于某种原因,没有正确过滤对资源的访问。我的安全 xml 文件如下所示。
<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_USER"/>
<intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
...
</http>
如您所见,我想用这个配置表达的是用户可以访问任何资源,除非他们正在访问映射到 /admin/something 的资源。
当我以仅使用 ROLE_USER 的用户身份登录时(在数据库中验证,因为我使用的是 jdbc-user-service),我仍然可以将浏览器指向
/myapp/admin/默认
并查看所有内容。
然后我将我的安全 xml 更改为如下所示。
<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_ADMIN"/>
<intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
...
</http>
当我使用 ROLE_USER 以用户身份登录时,我收到 HTTP 403 访问被拒绝。
我的问题是
- 为什么 /admin/** (ROLE_ADMIN) 不覆盖 /** (ROLE_USER) ?
- 哪个过滤器(或代码中的确切位置)对角色和资源进行实际检查?我看了一下 FilterSecurityInterceptor 但代码似乎只是在传递对象。
- 我该如何解决这个问题?我必须为 ROLE_USER 定义 /user/** 并为 ROLE_ADMIN 定义 /admin/** 吗?看起来这是一个可能的解决方案。
感谢任何帮助。
【问题讨论】:
标签: java spring spring-mvc spring-security