¿Cómo verificar la autoridad o el permiso del usuario en el código Java? Por ejemplo, quiero mostrar u ocultar el botón para el usuario según el rol. Hay anotaciones como:
@PreAuthorize("hasRole('ROLE_USER')")
¿Cómo hacerlo en código Java? Algo como :
if(somethingHere.hasRole("ROLE_MANAGER")) {
layout.addComponent(new Button("Edit users"));
}
java
spring-security
user-roles
Piotr Gwiazda
fuente
fuente
SecurityContextHolderAwareRequestWrapper
instancia. Podrías mejorarlo explicando cómo obtenerlo y aclarando un poco más la respuesta en sí.puede utilizar el método isUserInRole del objeto HttpServletRequest.
algo como:
fuente
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()
con la solicitud? :)En lugar de usar un bucle para encontrar la autoridad de UserDetails, puede hacer:
fuente
Puede recuperar el contexto de seguridad y luego usarlo:
fuente
SecurityContextHolder.getContext()
es nuncaNULL
, consulte los documentos. Por lo tanto, puede evitar verificar el contextoNULL
.Puede implementar un método hasRole () como se muestra a continuación: (esto se probó en Spring Security 3.0.x, no estoy seguro de otras versiones).
fuente
SecurityContextHolder.getContext().getAuthentication()
puede recuperarnull
. ¿Quizás agregue algún cheque?Estoy usando esto:
fuente
Puede obtener ayuda de la clase AuthorityUtils . Verificación de la función como una sola línea:
Advertencia: esto no comprueba la jerarquía de funciones, si existe.
fuente
La respuesta de JoseK no se puede usar cuando está en su capa de servicio, donde no desea introducir un acoplamiento con la capa web desde la referencia a la solicitud HTTP. Si está buscando resolver los roles mientras está en la capa de servicio, la respuesta de Gopi es el camino a seguir.
Sin embargo, es un poco largo. Se puede acceder a las autoridades directamente desde la autenticación. Por lo tanto, si puede asumir que tiene un usuario conectado, lo siguiente lo hace:
fuente
A la mayoría de las respuestas les faltan algunos puntos:
El rol y la autoridad no son lo mismo en Spring. Consulte aquí para obtener más detalles.
Los nombres de los roles son iguales a
rolePrefix
+authority
.ROLE_
Sin embargo, el prefijo de rol predeterminado es configurable. Vea aquí .Por lo tanto, una verificación de función adecuada debe respetar el prefijo de función si está configurado.
Desafortunadamente, la personalización del prefijo de rol en Spring es un poco hacky, en muchos lugares el prefijo predeterminado
ROLE_
está codificado, pero además de eso, un bean de tipoGrantedAuthorityDefaults
se verifica en el contexto de Spring, y si existe, el prefijo de rol personalizado se respeta.Al reunir toda esta información, una mejor implementación del verificador de roles sería algo como:
fuente
Por extraño que parezca, no creo que exista una solución estándar para este problema, ya que el control de acceso de seguridad de primavera se basa en expresiones , no en Java. puede consultar el código fuente de DefaultMethodSecurityExpressionHandler para ver si puede reutilizar algo que están haciendo allí
fuente
Mejor tarde que nunca, déjame poner mis 2 centavos.
En el mundo JSF, dentro de mi bean administrado, hice lo siguiente:
Como se mencionó anteriormente, tengo entendido que se puede hacer de la siguiente manera:
fuente
Esto es como llegar a la pregunta desde el otro lado, pero pensé en incluirla ya que realmente tuve que investigar en Internet para averiguarlo.
Hay muchas cosas sobre cómo verificar roles, pero no se dice mucho sobre lo que realmente está verificando cuando dice hasRole ("bla")
HasRole comprueba las autoridades otorgadas para el principal actualmente autenticado
Así que realmente cuando ves hasRole ("bla") realmente significa hasAuthority ("bla") .
En el caso que he visto, haces esto con una clase que implementa UserDetails que define un método llamado getAuthorities. En esto básicamente agregarás algunos
new SimpleGrantedAuthority("some name")
a una lista basada en cierta lógica. Los nombres en esta lista son las cosas verificadas por las declaraciones hasRole.Supongo que en este contexto, el objeto UserDetails es el principal actualmente autenticado. Hay algo de magia que ocurre dentro y alrededor de los proveedores de autenticación y, más específicamente, el administrador de autenticación que hace que esto suceda.
fuente
hasRole("bla")
ahora es igual ahasAuthority("ROLE_bla")
.¡La respuesta de @gouki es la mejor!
Solo un consejo de cómo la primavera realmente hace esto.
Hay una clase llamada
SecurityContextHolderAwareRequestWrapper
que implementa elServletRequestWrapper
clase.El
SecurityContextHolderAwareRequestWrapper
anula elisUserInRole
usuario de búsqueda yAuthentication
(que es administrado por Spring) para encontrar si el usuario tiene un rol o no.SecurityContextHolderAwareRequestWrapper
el código es como:fuente
Estas dos anotaciones a continuación son iguales, "hasRole" agregará automáticamente el prefijo "ROLE_". Asegúrate de tener la anotación correcta. Este rol se establece en UserDetailsService # loadUserByUsername.
luego, puede obtener el rol en el código java.
fuente
En nuestro proyecto, estamos usando una jerarquía de roles, mientras que la mayoría de las respuestas anteriores solo apuntan a verificar un rol específico, es decir, solo verificarían el rol asignado, pero no ese rol y ascenderían en la jerarquía.
Una solución para esto:
RoleHierarchy se define como un bean en spring-security.xml.
fuente
En su modelo de usuario, simplemente agregue un método 'hasRole' como el siguiente
Normalmente lo uso para verificar si el usuario autenticado tiene el rol de administrador de la siguiente manera
fuente
Los roles de usuario se pueden verificar de las siguientes maneras:
Usando métodos estáticos de llamada en SecurityContextHolder:
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_NAME"))) { //do something}
Usando HttpServletRequest
fuente
My Approach con la ayuda de Java8, pasar roles separados en coma le dará verdadero o falso
fuente