使用denyAll()和permitAll()一起使用Spring security 3.0.8无法正常工作

时间:2014-04-03 14:25:04

标签: java spring spring-security

我们有一个使用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 ,就会显示访问被拒绝。为什么?是因为 denyAll 优先于 permitAll?

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

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

1 个答案:

答案 0 :(得分:3)

intercept-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类,默认情况下应该拒绝该权限,以便他们可以为新类明确设置访问角色

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