Was ist der Unterschied zwischen @Secured und @PreAuthorize in Spring Security 3?

147

Mir ist nicht klar, was der Unterschied in der Frühlingssicherheit ist zwischen:

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

Und

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

Ich verstehe, dass PreAuthorize mit Spring El arbeiten kann, aber gibt es in meinem Beispiel einen echten Unterschied?

Jerome VDL
quelle

Antworten:

169

Der wirkliche Unterschied besteht darin, dass @PreAuthorizemit Spring Expression Language (SpEL) gearbeitet werden kann . Sie können:

  • Zugriffsmethoden und Eigenschaften von SecurityExpressionRoot.
  • Argumente für Zugriffsmethoden (Kompilierung mit Debug-Informationen oder benutzerdefiniert erforderlich ParameterNameDiscoverer):

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (Erweiterte Funktion) Fügen Sie Ihre eigenen Methoden hinzu (überschreiben Sie sie MethodSecurityExpressionHandlerund legen Sie sie fest <global-method-security><expression-handler ... /></...>).
axtavt
quelle
Wusste nichts davon, scheint aber großartig! : D
Alfonso Nishikawa
52

Wenn Sie nur dann auf die Methode zugreifen möchten, wenn der Benutzer über Rolle1 und Rolle2 verfügt, müssen Sie @PreAuthorize verwenden

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

Verwenden von

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

Einfach @PreAuthorizeist neuer als @Secured.

Ich sage also, es ist besser zu verwenden, @PreAuthorizeda es "ausdrucksbasiert" ist und Sie Ausdrücke wie hasRole, hasAnyRole, allowAll usw. verwenden können.

Informationen zu Ausdrücken finden Sie in diesen Beispielausdrücken .

Dennis
quelle
13

@PreAuthorizeist anders, es ist mächtiger als @Secured.

  • In den älteren @SecuredAnmerkungen konnten keine Ausdrücke verwendet werden.

  • Ab Spring Security 3 werden die flexibleren Anmerkungen @PreAuthorizeund @PostAuthorize(sowie @PreFilter und @PostFilter) bevorzugt, da sie Spring Expression Language (SpEL) unterstützen und eine ausdrucksbasierte Zugriffssteuerung bieten.

  • @Secured("ROLE_ADMIN")Anmerkung ist das gleiche wie @PreAuthorize ("hasRole('ROLE_ADMIN')").

  • Das @Secured({"ROLE_USER","ROLE_ADMIN")wird als ROLE_USER ODER ROLE_ADMIN betrachtet.

Sie können die UND-Bedingung also nicht mit ausdrücken

@ Gesichert . Sie können dasselbe mit definieren @PreAuthorize("hasRole('ADMIN') OR hasRole('USER')"), was einfacher zu verstehen ist. Sie können auch AND, OR oder NOT (!) Ausdrücken .

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

becher henchiri
quelle
1
Wollen Sie damit sagen, dass dies kein Fehler ist, als Sie meine Bearbeitung rückgängig gemacht haben "hasRole('ADMIN OR hasRole('USER')"?
Rigon
8
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
|                                               |                         @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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
Joby Wilson Mathews
quelle