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?
La vraie différence est que @PreAuthorize
peut travailler avec Spring Expression Language (SpEL) . Vous pouvez:
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)
MethodSecurityExpressionHandler
et définissez-le comme <global-method-security><expression-handler ... /></...>
).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
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 .
@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')")
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
| | @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){...} |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+