spring-security - @PreAuthorize 和拦截 url 优先级

标签 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() {
    // ...
}

在 Controller 中。

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

最佳答案

<intercept-url> XML 中的优先级高于注释。 <intercept-url>在 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

关于spring-security - @PreAuthorize 和拦截 url 优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28549538/

相关文章:

spring-boot - @AutoConfigureAfter 未按预期工作

java - Spring 注释 : Why @Required doesn't work when class is @Autowired

java - 如何将 Spring Config XML 迁移到 Spring Boot 注释

java - 使用 Spring MVC 未发现映射错误

spring - ROLE_USER 和 ADMIN 对 URL 的访问限制

java - 确保特定用户只能看到自己的用户详细信息 - 使用 Spring

java - Spring 安全问题 : Controller, 匿名请求

spring - 在集成测试中使用 Spring @ActiveProfile

java - 嵌入 Spring 的 ApacheDS

java - 自定义登录表单。配置 Spring 安全性以获取 JSON 响应