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 - 基于角色隐藏方法

Spring Security 检查外部 JWT 角色

Spring Security(Java Config)登录 - 根据用户角色返回不同的 URL

使用spring security进行身份验证后如何根据角色进行重定向[重复]