我有一个基本的SpringBoot应用程序。使用Spring Initializer,嵌入式Tomcat,Thymeleaf模板引擎和包作为可执行的JAR文件。
我想保护一个控制器:
@Controller
@RequestMapping("/company")
@RolesAllowed({"ROLE_ADMIN"})
@PreAuthorize("hasRole('ADMIN')")
@Secured("ADMIN")
public class CompanyController {
}
我知道有不同的选择,但我真的不知道应该使用哪种
答案 0 :(得分:10)
@Secured
和@RolesAllowed
在Spring中执行相同的功能。不同之处在于@Secured
是一个特定于Spring的注释,而@RolesAllowed
是一个Java标准注释(JSR250)。这些注释中的任何一个都不支持SpEL。
@PreAuthorize
是另一个Spring特定的注释。您可以使用SpEL使用@PreAuthorize
执行更强大的操作。您可以根据角色/权限,当前经过身份验证的用户以及传递给方法的参数来编写表达式limit方法调用。
@PreAuthorize("hasRole('ADMIN') or #user.id == authentication.name")
public void deleteUser(User user) {
...
}
至于哪个使用,这取决于你。 @Secure
和@PreAuthorize
会将您的代码绑定到Spring。如果与Spring绑定不是问题,或者您需要执行更强大的操作,请使用@PreAuthorize
。
答案 1 :(得分:4)
@PreAuthorize
,@RolesAllowed
和@Secured
的所有注释均允许配置方法安全性。它们既可以应用于单个方法,也可以应用于类级别,在后一种情况下,安全性约束将应用于类中的所有方法。
使用Spring AOP proxies实现方法级安全性。
@PreAuthorize
@PreAuthorize
注释允许使用 Spring表达式语言(SpEL)指定对方法的访问约束。这些约束是在执行方法之前进行评估的,如果约束不满足,可能会导致方法的执行被拒绝。 @PreAuthorize
注释是Spring Security框架的一部分。
为了能够使用@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)
下表显示了可与Spring Security 5一起使用的安全注释中对Spring Expression Language的支持:
╔═════════════════════╦═══════════════════╗
║ Security Annotation ║ Has SpEL Support? ║
╠═════════════════════╬═══════════════════╣
║ @PreAuthorize ║ yes ║
╠═════════════════════╬═══════════════════╣
║ @PostAuthorize ║ yes ║
╠═════════════════════╬═══════════════════╣
║ @PreFilter ║ yes ║
╠═════════════════════╬═══════════════════╣
║ @PostFilter ║ yes ║
╠═════════════════════╬═══════════════════╣
║ @Secured ║ no ║
╠═════════════════════╬═══════════════════╣
║ @RolesAllowed ║ no ║
╚═════════════════════╩═══════════════════╝
答案 2 :(得分:2)
所有这些基本上都与您的目的相同,但@PreAuthorize
最适合控制器和控制器方法。 @Secured
和@RolesAllowed
用于描述服务层安全属性。
还要注意@PreAuthorize
注释的工作原理,您必须定义配置类:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
...
}