【问题标题】:Using denyAll() and permitAll() together Spring security 3.0.8 not working一起使用 denyAll() 和 permitAll() Spring security 3.0.8 不起作用
【发布时间】:2017-01-17 18:46:37
【问题描述】:

我们得到了一个使用 Spring security 3.0.8 保护的 Web 应用程序。我们将 DWR 用于 ajax,相当多。现在我们要拒绝对所有 DWR 调用的访问,除非明确指定:

这是我做的,但不起作用:

<!-- Deny every url which is dwr call -->
<intercept-url pattern="/js/dwr/**/**DWR**" access="denyAll"/>

<!-- give access to SomeDWRClass for ROLE_A -->
<intercept-url pattern="/js/dwr/**/SomeDWRClass**" access="hasAnyRole('ROLE_A')"/>

<!-- Give access to everybody for CommonDwr.aCommonMethod.dwr -->
<intercept-url pattern="/js/dwr/CommonDwr.aCommonMethod.dwr" access="permitAll"/>

问题是每当调用 CommonDwr.aCommonMethod.dwr 时,它都会显示 access denied。 为什么?是不是因为 denyAll 的优先级高于 permitAll?

如果是这样,我该如何解决这个问题?我相信有很多人不得不像这样保护他们的应用程序。

我们这样做的主要原因是如果有新人来编写一个新的 DWR 类,默认情况下应该拒绝该权限,以便他们可以为新类显式设置访问角色。

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:

    intercept-url 模式按列出的顺序匹配。 一旦找到匹配项,指定的其余模式将被忽略。

    这就是为什么你应该早点列出更具体的模式。

    在您的情况下,特定的 url 模式稍后出现。所以denyAll首先找到并选择了那个。

    像这样颠倒顺序

    <!-- Give access to everybody for CommonDwr.aCommonMethod.dwr -->
    <intercept-url pattern="/js/dwr/CommonDwr.aCommonMethod.dwr" access="permitAll"/>
    
    <!-- give access to SomeDWRClass for ROLE_A -->
    <intercept-url pattern="/js/dwr/**/SomeDWRClass**" access="hasAnyRole('ROLE_A')"/>
    
    <!-- Deny every url which is dwr call -->
    <intercept-url pattern="/js/dwr/**/**DWR**" access="denyAll"/>
    

    Core Security Filters

    但我不明白原因

    我们这样做的主要原因是如果有新人来写一个新的 DWR 类,默认情况下应该拒绝权限,以便他们可以为新类显式设置访问角色

    创建角色来限制开发人员?通常角色是指应用提供的用户和功能。

    【讨论】:

    • 谢谢。 “创建角色以限制开发人员” - 实际上不是。我们只是遵循安全策略 - “默认拒绝”
    猜你喜欢
    • 2016-02-16
    • 2018-01-31
    • 2017-08-20
    • 1970-01-01
    • 2020-10-02
    • 2018-04-17
    • 1970-01-01
    • 2011-07-10
    • 2018-02-14
    相关资源
    最近更新 更多