【问题标题】:spring security intercept-url accessspring security拦截-url访问
【发布时间】:2013-06-04 10:42:29
【问题描述】:

在我们的应用中,我们有以下内容:

<intercept-url pattern="/app/**" access="ROLE_ADMIN,ROLE_USER,ROLE_CUST_ADMIN" />

但是,在我们的应用程序中,我们也可以创建自定义角色,并且当自定义角色的用户(例如,ROLE_LIMITED_USER)尝试登录时,访问被拒绝。

如何在不列出角色的情况下保护应用程序?或者我怎样才能让它接受一个模式ROLE_*

我尝试了以下方法:

<intercept-url pattern="/app/**" access="IS_AUTHENTICATED_FULLY" />

但是,这会导致会话超时并且需要用户登录。在更改之前,会记住用户登录。

欣赏任何解决方案 谢谢

【问题讨论】:

    标签: spring-security


    【解决方案1】:

    几件事:

    1. 您在应用程序中访问功能所需的角色不应更改 - 将它们更多地视为“权限”而不是“角色”。 (这里的 Spring Security 默认值可能用词不当。)然后您可以将权限集映射到角色(通过您自己的代码),允许将自定义角色创建为不同的权限包,但您正在编码的实际权限/检查是静态的 - 它们不会改变。当用户通过身份验证时,您在UserDetails 中填充的GrantedAuthority 集合应该是基于用户分配的角色权限 的合并集合。。 p>

    2. 也就是说,我认为您仍然可以使用Expression-Based Access Control 在不更改安全模型的情况下做您想做的事。假设您使用的是安全命名空间(即xmlns="http://www.springframework.org/schema/security"),那么您需要在&lt;http&gt; 元素上设置use-expressions="true",并将您的access 属性值更改为SpEL 表达式,例如:

      <http use-expressions="true">
          <intercept-url pattern="/app/**" access="hasAnyRole('ROLE_ADMIN','ROLE_USER','ROLE_CUST_ADMIN')" />
          <intercept-url pattern="/other1/**" access="isAuthenticated()" />
          <intercept-url pattern="/other2/**" access="authentication.authorities.?[authority.startsWith('ROLE_')].size() != 0" />
      </http>
      

    请注意,此代码 sn-p 尚未经过测试,我很确定第三个 intercept-url 示例不会按原样工作,但应该非常接近。 (它试图将Collection&lt;GrantedAuthority&gt; 过滤到以ROLE_ 开头的权限,并确保过滤后的列表不为空。)

    我的猜测是,使用第二个intercept-url 并在代码中进行任何进一步的自定义检查会更容易,您可以通过以下方式访问当前的SecurityContext / Authentication / principal:

    SecurityContextHolder.getContext()
    

    希望这会有所帮助。

    在这里也请注意类似的问题: Spring Security Authorize Access Role with a Wildcard

    【讨论】:

    • 感谢您的回答。我尝试了以下方法,但在所有情况下,我的应用程序在其他方面都失败了。事实证明,删除拦截 URL 检查会导致其他一些副作用。我想,我只是删除了一个访问检查,但是,其他东西坏了.. 1)我用自定义方法尝试了 SpEl。该方法被调用,但我的应用程序在其他页面中失败..所以,您的建议/解决方案有效,但是,我需要在应用程序中处理其他问题。谢谢你的回答。它有帮助。
    【解决方案2】:

    在您的类中使用 Spring 的 @PreAuthorize 注释,并通过 SpEL 引用自定义权限评估器。不用担心构建表达式解析器,因为您可以简单地从注解中引用布尔方法:

    @PreAuthorize("@myCustomClass.booleanMethod(param1, param2, #passedParam) and isAuthenticated()")
    myMethod(passedParam) {
        //do something
    }
    

    然后,在自定义类中,定义布尔方法,它可以随心所欲地处理您的角色(权限)——包括访问数据库以发现您新添加的角色。

    您将无法即时将新角色添加到 XML 配置中,因此如果您的问题与新角色创建有关(似乎是这种情况),您将需要类似上述的内容来完成它发生。使用 SpEL 和自定义布尔方法,您可以访问一组可能无限的限制和要求,您可以添加到您的应用程序中。

    【讨论】:

    • 我们已经在注释和评估器的帮助下实现了服务层安全性,正如您所解释的。对于我的拦截 url 问题,我认为只需删除该检查即可解决我的问题,因为无论如何我们都会在应用程序中进行身份验证检查。但是,当我删除该拦截 url 检查时,该应用程序在其他方面失败了。我想知道这项检查是否有副作用,使应用程序保持良好状态..不知道是什么。
    • 奇怪。我的应用根本不使用&lt;intercept-url/&gt;;我通过我的自定义权限评估器删除了它们以支持控制器级别的安全性。我希望我能提供更多帮助。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2012-07-20
    • 2013-10-27
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多