spring security 没有根据角色过滤对资源的访问
Posted
技术标签:
【中文标题】spring security 没有根据角色过滤对资源的访问【英文标题】:spring security is not filtering access to resources based on roles 【发布时间】: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/** 吗?看起来这是一个可能的解决方案。
感谢任何帮助。
【问题讨论】:
【参考方案1】:尝试将 admin 模式放在更通用的 /** 模式之前。从文档 (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>
【讨论】:
以上是关于spring security 没有根据角色过滤对资源的访问的主要内容,如果未能解决你的问题,请参考以下文章
如何使用spring security根据角色限制对html页面的访问?
Spring Security:所有端点返回状态 200 并且对约束没有响应作为 antMatchers
Swagger + Spring security - 基于角色隐藏方法