我有一个基本的SpringBoot应用程序。使用Spring Initializer,嵌入式Tomcat,Thymeleaf模板引擎以及作为可执行JAR文件的软件包。
我想保护控制器:
@Controller @RequestMapping("/company") @RolesAllowed({"ROLE_ADMIN"}) @PreAuthorize("hasRole('ADMIN')") @Secured("ADMIN") public class CompanyController { }
我知道有不同的选择,但我真的不知道应该使用哪个选项
所有的@PreAuthorize,@RolesAllowed并@Secured有注释,允许配置 方法的安全性 。它们既可以应用于单个方法,也可以应用于类级别,在后一种情况下,安全性约束将应用于类中的所有方法。
@PreAuthorize
@RolesAllowed
@Secured
使用Spring AOP代理可以实现方法级的安全性。
@PreAuthorize 注解允许使用 Spring Expression Language(SpEL) 指定对方法的访问约束。这些约束是在执行方法之前进行评估的,如果约束不满足,可能会导致方法的执行被拒绝。该@PreAuthorize注释是Spring安全框架的一部分。
为了能够使用@PreAuthorize,注释中的 prePostEnabled 属性 @EnableGlobalMethodSecurity需要设置为true:
prePostEnabled
@EnableGlobalMethodSecurity
true
@EnableGlobalMethodSecurity(prePostEnabled=true)
@RolesAllowed 注解起源于JSR-250 Java安全标准。此注释比注释 更受限制 ,@PreAuthorize因为它 仅支持基于角色的安全性 。
为了使用@RolesAllowed注释,包含该注释的库必须在类路径中,因为它不是Spring Security的一部分。另外,注释的 jsr250Enabled 属性@EnableGlobalMethodSecurity需要设置为true:
jsr250Enabled
@EnableGlobalMethodSecurity(jsr250Enabled=true)
@Secured 注解是 旧版Spring Security 2注解 ,可用于配置方法安全性。它不仅支持基于角色的安全性,而且不支持使用Spring Expression Language(SpEL)指定安全性约束。建议@PreAuthorize在新应用程序中使用该注释之上的注释。
为支持@Secured需要在明确启用注释 @EnableGlobalMethodSecurity使用注释 securedEnabled 属性:
securedEnabled
@EnableGlobalMethodSecurity(securedEnabled=true)
下表显示了可与Spring Security 5一起使用的安全注释中对Spring Expression Language的支持:
╔═════════════════════╦═══════════════════╗ ║ Security Annotation ║ Has SpEL Support? ║ ╠═════════════════════╬═══════════════════╣ ║ @PreAuthorize ║ yes ║ ╠═════════════════════╬═══════════════════╣ ║ @PostAuthorize ║ yes ║ ╠═════════════════════╬═══════════════════╣ ║ @PreFilter ║ yes ║ ╠═════════════════════╬═══════════════════╣ ║ @PostFilter ║ yes ║ ╠═════════════════════╬═══════════════════╣ ║ @Secured ║ no ║ ╠═════════════════════╬═══════════════════╣ ║ @RolesAllowed ║ no ║ ╚═════════════════════╩═══════════════════╝