Qual è la differenza tra @Secured e @PreAuthorize in Spring Security 3?


147

Non è chiaro per me qual è la differenza nella sicurezza primaverile tra:

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

E

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

Capisco che PreAuthorize può funzionare con Spring EL, ma nel mio campione c'è davvero una differenza?

Risposte:


169

La vera differenza è che @PreAuthorizepuò funzionare con Spring Expression Language (SpEL) . Puoi:

  • Metodi di accesso e proprietà di SecurityExpressionRoot.
  • Argomenti del metodo di accesso (richiede la compilazione con informazioni di debug o personalizzate ParameterNameDiscoverer):

    @PreAuthorize("#contact.name == principal.name")
    public void doSomething(Contact contact)
    
  • (Funzionalità avanzata) Aggiungi i tuoi metodi (esegui l'override MethodSecurityExpressionHandlere impostalo come <global-method-security><expression-handler ... /></...>).

Non lo sapevo, ma sembra fantastico! : D
Alfonso Nishikawa,

52

Se vuoi fare qualcosa come accedere al metodo solo se l'utente ha Role1 e Role2, allora dovresti usare @PreAuthorize

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

utilizzando

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

40

Semplicemente, @PreAuthorizeè più recente di @Secured.

Quindi dico che è meglio usare @PreAuthorizein quanto è "basato sull'espressione" e puoi usare espressioni come hasRole, hasAnyRole, allowAll, ecc.

Per informazioni sulle espressioni, vedi queste espressioni di esempio .


13

@PreAuthorizeè diverso, è più potente di @Secured.

  • Le @Securedannotazioni meno recenti non consentivano l'utilizzo delle espressioni.

  • A partire da Spring Security 3, sono preferite le annotazioni più flessibili @PreAuthorizee @PostAuthorize(così come @PreFilter e @PostFilter), poiché supportano Spring Expression Language (SpEL) e forniscono un controllo di accesso basato sull'espressione.

  • @Secured("ROLE_ADMIN")l'annotazione è la stessa di @PreAuthorize ("hasRole('ROLE_ADMIN')").

  • Il @Secured({"ROLE_USER","ROLE_ADMIN")è considerato come ROLE_USER O ROLE_ADMIN.

quindi non puoi esprimere la condizione AND usando

@Secured . Puoi definire lo stesso con @PreAuthorize("hasRole('ADMIN') OR hasRole('USER')"), che è più facile da capire. Puoi anche esprimere AND, OR o NOT (!) .

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


1
Quando hai ripristinato la mia modifica, stai dicendo che non ci sono errori in questo "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){...}                         |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.