【问题标题】:spring security is not filtering access to resources based on rolesspring security 没有根据角色过滤对资源的访问
【发布时间】: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 访问被拒绝。

我的问题是

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

感谢任何帮助。

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 1970-01-01
      • 2015-02-21
      • 2016-06-13
      • 2023-04-08
      • 2017-10-19
      • 2019-02-10
      • 2017-04-22
      • 2019-08-08
      相关资源
      最近更新 更多