@PreAuthorize和intercept-url优先级

时间:2015-02-16 20:12:00

标签: spring-security spring-annotations

我有

<security:http use-expressions="true">
    <security:intercept-url pattern="/**/*" access="hasRole('ROLE_USER')"/>

在Spring Security上下文配置文件和

@PreAuthorize("permitAll")
@RequestMapping("/public")
public String aMethod() {
    // ...
}

在控制器中。

我想要的是除了public之外需要身份验证的所有网址。这可能吗?

1 个答案:

答案 0 :(得分:1)

XML中的

<intercept-url>优先于注释。 <intercept-url>适用于网址级别和方法级别的注释。

如果您要使用spring securityspring <form-login />,那么下面的方法可以更好地为您服务。

<intercept-url pattern="/public/**"
                   access="permitAll" />

<intercept-url pattern="/restricted/**"
                   access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN', 'ROLE_SOME')


@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SOME')")
@RequestMapping("/restricted/aMethod")
public String aMethod() {
    // ...
}

restricted下的任何内容都可以由三个不同的角色访问。但restricted/aMethod@PreAuthorize("ROLE_ADMIN")可以访问特定路径@PreAuthorize("ROLE_SOME"),但@PreAuthorize("ROLE_USER")不能访问。默认情况下,所有三个角色都可以访问,但是当您使用@PreAuthorize("ROLE_ADMIN")标记某个路径时,具有ROLE_ADMIN的用户可以访问该路径。

如果您考虑一下,@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SOME')")充当从大量ROLES到单个(或一组角色)ROLE的缩小或过滤访问权限。

正如您所注意到的,/restricted无法访问permitAll个路径。它首选/static/*.css以及permitAll下的其他人。

HTH