2010-09-24 8 views

Respuesta

127

La verdadera diferencia es que @PreAuthorize puede funcionar con Spring Expression Language (SpEL). Puede:

  • Métodos de acceso y propiedades de SecurityExpressionRoot.
  • argumentos del método de acceso (requiere compilación con información de depuración o la costumbre ParameterNameDiscoverer):

    @PreAuthorize("#contact.name == principal.name") 
    public void doSomething(Contact contact) 
    
  • (función avanzada) Añada sus propios métodos (anular MethodSecurityExpressionHandler y configurarlo como <global-method-security><expression-handler ... /></...>).
+1

OK, entonces en mi ejemplo no hay diferencia, gracias! –

+0

No sabía de esto, pero parece increíble!: D –

32

Simplemente, @PreAuthorize es más nuevo que @Secured.

Por eso digo que es mejor utilizar @PreAuthorize, ya que es "basadas en la expresión" y se puede utilizar expresiones como hasRole, hasAnyRole, permitAll, etc.

Para aprender acerca de las expresiones, ver a estos example expressions.

36

Si quería hacer algo así como el acceso al método sólo si el usuario tiene role1 y Role2 la que tendrían que utilizar @PreAuthorize

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

Uso

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

@PreAuthorize es diferente, es más poderoso que @Secured.

Las antiguas anotaciones seguras no permitían el uso de expresiones. A partir de Spring Security 3, se prefieren las anotaciones más flexibles @PreAuthorize y @PostAuthorize (así como @PreFilter y @PostFilter), ya que admiten Spring Expression Language (SpEL) y proporcionan control de acceso basado en expresiones.

El @Secured ("ROLE_ADMIN") anotación es la misma que @PreAuthorize ("hasRole ('ROLE_ADMIN')") El @Secured ({ "ROLE_USER", "ROLE_ADMIN") se considera como ROLE_USER O ROLE_ADMIN. por lo que no puede expresar la condición Y usando @Secured. Puede definir lo mismo con @PreAuthorize ("hasRole ('ADMIN O hasRole (' USER ')"), que es más fácil de comprender . Puede expresar Y, O, o NO (!) También.

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

Cuestiones relacionadas