在Spring Security 3中@Secured和@PreAuthorize有什么区别?

我不清楚弹簧安全性在以下方面有什么不同:

@PreAuthorize("hasRole('ROLE_USER')") public void create(Contact contact) 

 @Secured("ROLE_USER") public void create(Contact contact) 

我知道PreAuthorize可以和Spring el一起工作,但在我的示例中,有没有真正的区别?

真正的区别是@PreAuthorize可以使用Springexpression式语言(SpEL) 。 您可以:

  • SecurityExpressionRoot访问方法和属性。
  • 访问方法参数(需要使用debugging信息或自定义ParameterNameDiscoverer编译):

     @PreAuthorize("#contact.name == principal.name") public void doSomething(Contact contact) 
  • (高级function)添加您自己的方法(重写MethodSecurityExpressionHandler并将其设置为<global-method-security><expression-handler ... /></...> )。

如果你只想在用户拥有Role1和Role2的情况下进行访问,那么你必须使用@PreAuthorize

 @PreAuthorize("hasRole('ROLE_role1') and hasRole('ROLE_role2')") 

运用

 @Secured({"role1", "role2"}) is treated as an OR 

简单地说, @PreAuthorize@Secured更新。

所以我说最好是使用@PreAuthorize因为它是“基于expression式”,你可以使用像hasRole,hasAnyRole,permitAll等expression式。

要了解expression式,请参阅这些示例expression式 。

@PreAuthorize不同,它比@Secured更强大。

较旧的@Secured注释不允许使用expression式。 从Spring Security 3开始,更灵活的批注@PreAuthorize和@PostAuthorize(以及@PreFilter和@PostFilter)是首选,因为它们支持Springexpression式语言(SpEL)并提供基于expression式的访问控制。

@Secured (“ROLE_ADMIN”)注释与@PreAuthorize (“hasRole('ROLE_ADMIN')”)相同@Secured({“ROLE_USER”,“ROLE_ADMIN”)被认为是ROLE_USER或ROLE_ADMIN。 所以你不能使用@SecuredexpressionAND条件。 您可以使用@PreAuthorize (“hasRole('ADMIN或hasRole('USER')”)来定义,这更容易理解,也可以表示AND,OR或NOT(!)。

@PreAuthorize (“!isAnonymous()AND hasRole('ADMIN')”)