我们什么时候应该使用@PreAuthorize 和@Secured

When should we use @PreAuthorize and @Secured

我读了这个 Whosebug post What's the difference between @Secured and @PreAuthorize in spring security 3? 但是,我仍然不清楚两者在安全性方面的最大区别是什么?与@Secured相比,在什么情况下我们应该使用@PreAuthorize?

@PreAuthorize 允许您对规则进行更细粒度的控制以保护 o 方法。您可以在其中使用 SpEL 表达式。

使用 @Secured 保护方法可以得到与 @PreAuthorize 相同的结果,但是 @Secured 是有限的,您没有太多的选项来调整规则(总简化就是规则是“静态的”)。

Spring Security 3.0 introduced the ability to use Spring EL expressions as an authorization mechanism in addition to the simple use of configuration attributes and access-decision voters which have seen before. Expression-based access control is built on the same architecture but allows complicated boolean logic to be encapsulated in a single expression.

@PreAuthorize是一个较新的版本,所以你应该总是选择@PreAuthorize,因为here.

提到的原因,它确实更好

事实上

@Secured("ROLE_ADMIN") 等同于 @PreAuthorize("hasRole('ROLE_ADMIN')")

此外,@PreAuthorize 语法更具可读性。

例如 @Secured({"ROLE_USER", "ROLE_ADMIN"}) 被视为 ROLE_USER or ROLE_ADMIN,这是一件奇怪且令人困惑的事情。

@PreAuthorize 的另一边,您使用 "Spring Expression Language (SpEL)" 显式定义 orand 表达式,这显然方便且更易读。

所以选择 @PreAuthorize