156 votes

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

Je ne vois pas très bien quelle est la différence en matière de sécurité du ressort 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 exemple, y a-t-il une réelle différence ?

174voto

axtavt Points 126632

La vraie différence est que @PreAuthorize peut travailler avec Langage d'expression de printemps (SpEL) . Vous pouvez :

  • Accéder aux méthodes et aux propriétés de SecurityExpressionRoot .

  • Accéder aux arguments de la méthode (nécessite une compilation avec debug info ou personnalisée) ParameterNameDiscoverer ):

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

0 votes

Je ne connaissais pas, mais ça a l'air génial ! :D

56voto

arnabmitra Points 133

Si vous vouliez faire quelque chose comme accéder à la méthode uniquement si l'utilisateur a le Rôle1 y Role2, vous devez alors utiliser @PreAuthorize.

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

Utilisation de

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

43voto

Dennis Points 141

Tout simplement, @PreAuthorize est plus récent que @Secured .

Je dis donc qu'il est préférable d'utiliser @PreAuthorize car il est "basé sur des expressions" et vous pouvez utiliser des expressions comme hasRole, hasAnyRole, permitAll, etc.

Pour en savoir plus sur les expressions, consultez ces exemples d'expressions .

13voto

becher henchiri Points 372

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

  • Les plus âgés @Secured ne permettait pas l'utilisation d'expressions.

  • À partir de Spring Security 3, les annotations plus souples @PreAuthorize y @PostAuthorize (ainsi que @PreFilter et @PostFilter) sont préférables, car ils supportent Spring Expression Language (SpEL) et fournissent un contrôle d'accès basé sur les expressions.

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

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

donc vous ne pouvez pas exprimer la condition ET en utilisant

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

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

8voto

+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
|                                               |                         @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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X