在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')”)