web-dev-qa-db-fra.com

Quelle est la différence entre @Secured et @PreAuthorize dans Spring Security 3?

Il n’est pas clair pour moi quelle est la différence de sécurité au printemps entre:

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

Et

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

Je comprends que PreAuthorize peut fonctionner avec spring el, mais dans mon échantillon, existe-t-il une réelle différence?

134
Jerome VDL

La vraie différence est que @PreAuthorize peut travailler avec Spring Expression Language (SpEL) . Vous pouvez:

  • Méthodes d'accès et propriétés de SecurityExpressionRoot .
  • Arguments de la méthode d’accès (nécessite une compilation avec les informations de débogage ou personnalisée ParameterNameDiscoverer ):

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (Fonctionnalité avancée) Ajoutez vos propres méthodes (override MethodSecurityExpressionHandler et définissez-le comme <global-method-security><expression-handler ... /></...>).
156
axtavt

Si vous voulez faire quelque chose comme accéder à la méthode uniquement si l'utilisateur a Role1 et Role2, vous devrez alors utiliser @PreAuthorize.

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

En utilisant

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

Simplement, @PreAuthorize est plus récent que @Secured.

Alors je dis qu'il vaut mieux utiliser @PreAuthorize comme il est "basé sur une expression" et que vous pouvez utiliser des expressions telles que hasRole, hasAnyRole, permitAll, etc.

Pour en savoir plus sur les expressions, voir: exemples d'expressions .

35
Dennis

@PreAuthorize Est différent, il est plus puissant que @Secured.

  • Les anciennes annotations @Secured N'autorisaient pas l'utilisation d'expressions.

  • À partir de Spring Security 3, les annotations plus souples @PreAuthorize Et @PostAuthorize (Ainsi que @PreFilter et @PostFilter) sont préférées car elles prennent en charge le langage d'expression Spring (SpEL) et fournissent des fonctions d'expression. contrôle d'accès.

  • L'annotation @Secured("ROLE_ADMIN") est identique à @PreAuthorize ("hasRole('ROLE_ADMIN')").

  • La @Secured({"ROLE_USER","ROLE_ADMIN") est considérée comme ROLE_USER OU ROLE_ADMIN.

de sorte que vous ne pouvez pas exprimer la condition AND en utilisant

@ Sécurisé. Vous pouvez définir la même chose avec @PreAuthorize("hasRole('ADMIN OR hasRole('USER')"), qui est plus facile à comprendre. Vous pouvez aussi exprimer AND, OR ou NOT (!).

@ PreAuthorize ("! IsAnonymous () AND hasRole ('ADMIN')")

8
becher henchiri
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
|                                               |                         @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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
4