【问题标题】:@PreAuthorize and intercept-url priority@PreAuthorize 和拦截 URL 优先级
【发布时间】:2015-04-17 10:37:32
【问题描述】:

我有

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

在 Spring Security 上下文配置文件中和

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

在控制器中。

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

【问题讨论】:

  • 那行不通。您定义的/**/* 全局模式。意味着一切都应该有ROLE_USER,然后你正在尝试/public,这与/**混淆。为什么不定义两种模式。
  • 我想要实现的是保护所有 URL,除非在 @PreAuthorize 注释中另有说明。我应该如何定义这两种模式来实现这一点?
  • 一旦你在 XML 全局路径级别定义了一些东西,那么它甚至不会达到 @PreAuthorize("permitAll") 方法级别。我建议把它分开。类似于 - ` ``.
  • 已验证,它不起作用,也不应该起作用。
  • 因此,XML 中的 intercept-url 优先于注解。请将此作为答案,我会接受。但是,如果 URL 不被任何拦截 URL 或任何 @PreAuthorize 注释匹配,是否可以定义默认行为?

标签: spring-security spring-annotations


【解决方案1】:

&lt;intercept-url&gt; 在 XML 中优先于注解。 &lt;intercept-url&gt; 在 URL 级别工作,在方法级别工作。

如果您打算使用spring securityspring &lt;form-login /&gt;,那么下面的方法会更好地为您服务。

<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 的缩小或过滤访问。

您会注意到,permitAll 无法访问任何/restricted 路径。最好有/static/*.csspermitAll 下的其他人。

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2011-11-01
    • 2011-04-24
    • 2016-03-01
    相关资源
    最近更新 更多