2009-05-21 6 views
19

Estoy usando spring-security framework. Cuando actualizo los permisos, no surte efecto inmediatamente. Tengo que abandonar el usuario actual (significa cerrar la sesión), y luego volver a visitar (significa iniciar sesión) será actualizar el permiso del usuario¿Cómo habilitar inmediatamente la autoridad después de actualizar la autoridad del usuario en la seguridad de primavera?

¿Es una forma de habilitar inmediatamente la autoridad después de actualizar la autoridad del usuario en la seguridad de primavera?

+0

Una posible solución se describe en [Ajuste de la sesión segura en tiempo real] (http://spring.io/blog/2009/01/03/spring-security-customization-part-2-adjusting-secured-session- en tiempo real) publicar en el blog de Spring Source. – Karimchik

+0

Me tomó un tiempo, pero creo que esto finalmente se resolvió: http://stackoverflow.com/q/23072235/42962 – hooknc

Respuesta

0

Ya que no acababa de proporcionar los detalles exactos de su pregunta, se supone que tiene una situación donde:

  1. está suministrando un UserDetailsService para cargar un DetallesUsuario cuando un usuario intenta iniciar sesión
  2. Como parte de ese servicio, está consultando una base de datos/DAO para cargar detalles sobre los permisos de un usuario, y está configurando las autorizaciones otorgadas basadas en este
  3. que cuando dice "Cuando actualizo los permisos" está haciendo referencia a la actualización de los permisos del usuario en la base de datos (o en lo que esté almacenando datos).

Si es así, entonces lo que está viendo es por diseño: Spring Security solo carga los UserDetails para el usuario la primera vez, cuando intentan iniciar sesión, y luego los almacena en Session a partir de ese momento. En general, esto tiene sentido, ya que evita que la aplicación tenga que realizar las mismas consultas sobre los detalles del usuario en cada solicitud. Además, los permisos de un usuario generalmente no cambian en el 99.9% de sus visitas.

Para cambiar este comportamiento, le recomendamos que agregue un comando/página de "actualización" en algún lugar que activará algún código (que tendrá que escribir) que volverá a consultar UserDetailsService y reemplazará UserDetails en SecurityContext . No creo que haya una forma incorporada de hacer esto.

+0

Su suposición es correcta. Me gustaría saber si hay alguna buena manera de hacerlo sin tener para volver a iniciar sesión. Tal vez pueda modificar los permisos de los usuarios que se almacenan en la sesión actual. Estoy tratando de ... –

0

Puede crear su propia implementación de la interfaz UserDetails que se devuelve desde su mecanismo de autenticación, que permite el acceso a las Autoridades otorgadas []. A continuación, agregue su nueva autoridad directamente a ese objeto UserDetails. Puede encontrarse con problemas si un usuario puede tener varias sesiones abiertas a la vez (o si varios usuarios comparten el mismo inicio de sesión genérico), que los nuevos permisos solo se verán en la sesión que ha alterado.

3

La solución de Gandalf es válida pero no completa. Para que los nuevos permisos sean considerados por la seguridad de primavera (por ejemplo, permitir el acceso a páginas que anteriormente no estaban disponibles), debe crear un nuevo objeto de autenticación (por ejemplo, new UsernamePasswordAuthenticationToken) que contenga la nueva lista de autoridades.

7

Puede establecer alwaysReauthenticate en su AbstractSecurityInterceptor como esto

<bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor"> 
     <property name="alwaysReauthenticate" value="true"/> 
... 
</bean> 

Por supuesto, se debe prestar atención, porque el 99,9% que no es necesario repetir la autenticación. Como la autenticación puede usar una base de datos u otra cosa, su desempeño puede degradarse. Pero generalmente tiene una memoria caché, como 2nd Level con hibernación, por lo que cargar los detalles del usuario siempre debe ser una operación de solo memoria en todos los casos donde las autoridades no han cambiado.

+1

Si quiero asegurar los métodos en los beans, ¿necesito hacer el mismo cambio en otro filtro, o es esto ¿suficiente? –

+1

este filtro es solo para solicitud web por lo que veo. Si está utilizando MEthodSecurityInterceptor puede llamar a la reautenticación por su cuenta. Pero si cada llamada al método está precedida por la comprobación de este filtro web, ya que cada llamada al método está algo dentro de una solicitud http, debería estar bien – Janning

+0

Esta es la respuesta correcta. Me gustaría solo agregar que uno necesita incorporar este interceptor en la configuración de seguridad por '' dentro de la sección o por propiedad del interceptor: '< property name = "securityMetadataSource"> ' –

-2

puede probar esta

SecurityContextHolder.getContext().setAuthentication(SecurityContextHolder.getContext().getAuthentication()); 
+1

He intentado este código , pero lamentablemente no tuvo ningún efecto. – chelder

2

no es suficiente para restablecer el hilo contexto local, es necesario actualizar la sesión también:

UserContext userContext = (UserContext) context.getAuthentication().getPrincipal(); 
if (userContext != null && userContext.getUsername() != null) { 
    //This is my function to refresh the user details 
    UserDetailsBean userDetails = getUserDetailsBean(userContext.getUsername()); 
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
    if (authentication instanceof UsernamePasswordAuthenticationToken) { 
     UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken) authentication; 
     auth.setDetails(userDetails); 
    } 
    return userDetails; 
} else { 
    throw new ServiceException("User not authenticated"); 
} 
request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext()); 

Al menos en Google App Engine la sesión no es una referencia y al modificar el hilo local no se actualiza automáticamente, tiene que iniciar sesión manualmente.

+0

no funcionó, incluso al actualizar los atributos de la sesión –

Cuestiones relacionadas