我们得到了一个使用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的优先级高于allowAll吗?

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

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

最佳答案

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


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

关于java - 一起使用denyAll()和permitAll()Spring Security 3.0.8无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22840681/

10-10 14:16