@RolesAllowed vs. @PreAuthorize vs. @Secured

时间:2017-05-14 07:54:30

标签: spring spring-mvc spring-boot spring-security

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

我想保护一个控制器:

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

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

3 个答案:

答案 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) {
    ...
}

http://docs.spring.io/autorepo/docs/spring-security/4.0.x/reference/html/el-access.html#el-common-built-in

至于哪个使用,这取决于你。 @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)

哪些安全注释允许使用SpEL

下表显示了可与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 {
...
}