2010-09-24 8 views

risposta

127

La vera differenza è che @PreAuthorize può funzionare con Spring Expression Language (SpEL). È possibile:

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

    @PreAuthorize("#contact.name == principal.name") 
    public void doSomething(Contact contact) 
    
  • (Funzioni avanzate) Aggiungere i propri metodi (ignorare MethodSecurityExpressionHandler e impostarlo come <global-method-security><expression-handler ... /></...>).
+1

OK, quindi nel mio esempio nessuna differenza, grazie! –

+0

Non lo sapevo, ma sembra fantastico!: D –

32

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

Così mi dicono che è meglio usare @PreAuthorize come è "espressione-based" ed è possibile utilizzare espressioni come hasRole, hasAnyRole, permitAll, ecc

Per conoscere le espressioni, vedere questi example expressions.

36

se si voleva fare qualcosa di simile l'accesso al metodo solo se l'utente ha Role1 e Role2 la si dovrebbe usare @PreAuthorize

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

Uso

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

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

Le vecchie annotazioni @Secured non consentivano l'utilizzo di espressioni. A partire da Spring Security 3, sono preferite le annotazioni più flessibili @PreAuthorize e @PostAuthorize (nonché @PreFilter e @PostFilter), in quanto supportano Spring Expression Language (SpEL) e forniscono il controllo degli accessi basato sull'espressione.

Il @Secured ("ROLE_ADMIN") annotazione è lo stesso di @PreAuthorize ("hasRole ('ROLE_ADMIN')") Il @Secured ({ "ROLE_USER", "ROLE_ADMIN") è considerato come ROLE_USER O ROLE_ADMIN. quindi non è possibile esprimere la condizione AND utilizzando @Secured. Puoi definire lo stesso con @PreAuthorize ("hasRole ('ADMIN OR hasRole (' USER ')"), che è più semplice da comprendere . Puoi esprimere AND, OR, o NOT (!) Pure

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

Problemi correlati