在春季安全3中,“安全”和“预授权”有什么区别?

我不清楚春季安全措施的区别在哪里:

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

还有

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

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

67395 次浏览

真正的区别是 @PreAuthorize可以和 Spring 表达式语言(SPEL)一起工作。你可以:

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

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (Advanced feature) Add your own methods (override MethodSecurityExpressionHandler and set it as <global-method-security><expression-handler ... /></...>).

很简单, @PreAuthorize@Secured新。

因此,我认为最好使用 @PreAuthorize,因为它是“基于表达式的”,您可以使用 hasRole、 hasAnyrole、 permitAll 等表达式。

要了解表达式,请参阅这些 例句

如果您希望只在用户有 Role1 还有 Role2的情况下访问该方法,那么您必须使用@PreAuthorize

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

吸毒

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

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

  • 旧的 @Secured注释不允许使用表达式。

  • 从 SpringSecurity3开始,更灵活的注释 @PreAuthorize@PostAuthorize(以及@PreFilter 和 @ PostFilter)是首选的,因为它们支持 Spring 表达式 语言(SpEL)并提供基于表达式的访问控制。

  • @Secured("ROLE_ADMIN")注释与 @PreAuthorize ("hasRole('ROLE_ADMIN')")相同。

  • @Secured({"ROLE_USER","ROLE_ADMIN")被认为是 ROLE _ USER 或者 ROLE _ ADMIN。

所以不能使用

您可以用 @PreAuthorize("hasRole('ADMIN') OR hasRole('USER')")定义相同的内容,这样更容易 你也可以表达 和,或,或不(!)

@ PreAuthorize (“ ! isAnonymous () AND hasRole (‘ ADMIN’)”)

+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
|                                               |                         @Secured                         |                         @PreAuthorize                           |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| Spring EL expressions                         | Does'nt supports.                                        | Supports                                                        |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| Multiple roles conjunctions with AND operator | Does'nt supports.(If there are multiple roles defined    | Supports                                                        |
|                                               |they will be automatically combined with OR operator)     |                                                                 |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| To enable annotation                          | Add following line to spring-security.xml                | Add following line to spring-security.xml                       |
|                                               | <global-method-security secured-annotations="enabled" /> | <global-method-security pre-post-annotations="enabled"/>        |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| Example                                       | @Secured({ROLE_ADMIN , ROLE_USER})                       | @PreAuthorize("hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')") |
|                                               | public void addUser(UserInfo user){...}                  | public void addUser(UserInfo user){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+