spring-security - preauthorize - spring security method
¿Cuál es la diferencia entre @Secured y @PreAuthorize en spring security 3? (5)
No está claro para mí cuál es la diferencia en la seguridad de primavera entre:
@PreAuthorize("hasRole(''ROLE_USER'')")
public void create(Contact contact)
Y
@Secured("ROLE_USER")
public void create(Contact contact)
Entiendo que PreAuthorize puede funcionar con Spring el pero en mi muestra, ¿hay alguna diferencia real?
La verdadera diferencia es que @PreAuthorize
puede funcionar con Spring Expression Language (SpEL) . Usted puede:
- Acceda a los métodos y propiedades de
SecurityExpressionRoot
. Argumentos de método de acceso (requiere compilación con información de depuración o
ParameterNameDiscoverer
personalizado):@PreAuthorize("#contact.name == principal.name") public void doSomething(Contact contact)
- (Característica avanzada) Agregue sus propios métodos (anule
MethodSecurityExpressionHandler
yMethodSecurityExpressionHandler
como<global-method-security><expression-handler ... /></...>
).
Si quieres hacer algo como acceder al método solo si el usuario tiene Role1 y Role2, deberías usar @PreAuthorize
@PreAuthorize("hasRole(''ROLE_role1'') and hasRole(''ROLE_role2'')")
Utilizando
@Secured({"role1", "role2"}) is treated as an OR
Simplemente, @PreAuthorize
es más nuevo que @Secured
.
Entonces digo que es mejor usar @PreAuthorize
ya que está "basado en expresiones" y puedes usar expresiones como hasRole, hasAnyRole, permitAll, etc.
Para aprender sobre expresiones, mira estas expresiones de ejemplo .
@PreAuthorize
es diferente, es más poderoso que @Secured
.
Las anotaciones
@Secured
más@Secured
no permitían el uso de expresiones.A partir de Spring Security 3, se
@PreAuthorize
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.@Secured("ROLE_ADMIN")
es la misma que@PreAuthorize ("hasRole(''ROLE_ADMIN'')")
.El
@Secured({"ROLE_USER","ROLE_ADMIN")
se considera 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 OR hasRole(''USER'')")
, que es más fácil de entender. Puede expresar AND, OR, o NOT (!) También.@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){...} |
+-----------------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+