一尘不染

@RolesAllowed与@PreAuthorize与@Secured

spring-boot

我有一个基本的SpringBoot应用程序。使用Spring
Initializer,嵌入式Tomcat,Thymeleaf模板引擎以及作为可执行JAR文件的软件包。

我想保护控制器:

@Controller
@RequestMapping("/company")
@RolesAllowed({"ROLE_ADMIN"})
@PreAuthorize("hasRole('ADMIN')")
@Secured("ADMIN")
public class CompanyController {
}

我知道有不同的选择,但我真的不知道应该使用哪个选项


阅读 574

收藏
2020-05-30

共1个答案

一尘不染

安全注释

所有的@PreAuthorize@RolesAllowed@Secured有注释,允许配置 方法的安全性
。它们既可以应用于单个方法,也可以应用于类级别,在后一种情况下,安全性约束将应用于类中的所有方法。

使用Spring
AOP代理
可以实现方法级的安全性。

@PreAuthorize

@PreAuthorize 注解允许使用 Spring Expression Language(SpEL)
指定对方法的访问约束。这些约束是在执行方法之前进行评估的,如果约束不满足,可能会导致方法的执行被拒绝。该@PreAuthorize注释是Spring安全框架的一部分。

为了能够使用@PreAuthorize,注释中的 prePostEnabled 属性
@EnableGlobalMethodSecurity需要设置为true

@EnableGlobalMethodSecurity(prePostEnabled=true)

@RolesAllowed

@RolesAllowed 注解起源于JSR-250
Java安全标准。此注释比注释 更受限制@PreAuthorize因为它 仅支持基于角色的安全性

为了使用@RolesAllowed注释,包含该注释的库必须在类路径中,因为它不是Spring Security的一部分。另外,注释的
jsr250Enabled 属性@EnableGlobalMethodSecurity需要设置为true

@EnableGlobalMethodSecurity(jsr250Enabled=true)

@Secured

@Secured 注解是 旧版Spring Security 2注解
,可用于配置方法安全性。它不仅支持基于角色的安全性,而且不支持使用Spring Expression
Language(SpEL)指定安全性约束。建议@PreAuthorize在新应用程序中使用该注释之上的注释。

为支持@Secured需要在明确启用注释 @EnableGlobalMethodSecurity使用注释 securedEnabled
属性:

@EnableGlobalMethodSecurity(securedEnabled=true)

哪些安全注释允许使用SpEL

下表显示了可与Spring Security 5一起使用的安全注释中对Spring Expression Language的支持:

╔═════════════════════╦═══════════════════╗
║ Security Annotation ║ Has SpEL Support? ║
╠═════════════════════╬═══════════════════╣
║  @PreAuthorize      ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @PostAuthorize     ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @PreFilter         ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @PostFilter        ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @Secured           ║        no         ║
╠═════════════════════╬═══════════════════╣
║  @RolesAllowed      ║        no         ║
╚═════════════════════╩═══════════════════╝
2020-05-30