2010-02-18 15 views
6

utilizo SecurityContextHolder y una costumbre para obtener UserDetailsServiceUserDetails de SecurityContextHolder:¿Es seguro el subproceso SecurityContextHolder?

Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
UserDetailsDTO user = (UserDetailsDTO) o; 

Salí a cabo los controles nulos, etc., pero esa es la idea. Estoy usando esto en un punto de corte de un @Around@Aspect:

@Around("execution(* user.service.*.*(..))") 
public Object audit(ProceedingJoinPoint call) throws Throwable { 
    // get user id 
    // add audit row in db 
} 

En cuanto a la clase SecurityContextHolder, se utiliza un ThreadLocal por defecto, pero las cosas pointcut también parece tener algún tipo de lógica roscado encapsulado.

Es posible que haya una colisión del usuario (es decir, acceda a UserA desde una sesión para un evento de auditoría UserB en otra sesión concurrente), o posiblemente un usuario nulo por completo.

¿Existe una forma mejor de obtener las credenciales/perfil de usuario?

Respuesta

5

Sí, es seguro para subprocesos con la estrategia predeterminada (MODE_THREADLOCAL) (siempre que no intente cambiar la estrategia sobre la marcha). Sin embargo, si desea que los hilos engendrados hereden SecurityContext del hilo principal, debe establecer MODE_INHERITABLETHREADLOCAL.

También los aspectos no tienen ninguna "lógica de enhebrado", se ejecutan en el mismo hilo que el método recomendado.

+0

Vi eso, pero el hombre parece un gran error para los chicos de Spring. Una clase utilitaria estática, y setStrategyName tiene esta etiqueta Javadoc: 'NO invoque este método más de una vez para una JVM dada, ya que reinicializará la estrategia y afectará adversamente cualquier hilo existente usando la vieja estrategia. Creo que probablemente terminan creando una clase de contenedor singleton. – Droo

+0

Supongo que también hay una propiedad del sistema: 'public static final String SYSTEM_PROPERTY = "spring.security.strategy"; ' – Droo

-1

Sí, es seguro para subprocesos. Debería llamar al SecurityContextHolder.getContext(). GetAuthentication(). GetName()

+0

Razones para downvote por favor – vsingh

1

En general, ThreadLocal no será amigable en un grupo de subprocesos en caché global. Un grupo de subprocesos en caché predeterminado de ExecutorService (Executors.newCachedThreadPool()) tendrá el almacenamiento ThreadLocal del hilo de inicialización o uno vacío. En esta situación, establecer MODE_INHERITABLETHREADLOCAL no cambiará nada, a menos que el threadpool almacenado en caché se inicialice por solicitud, lo cual sería un mal uso del mismo ... Asegúrese de que los frameworks o bibliotecas subyacentes no estén utilizando Executors.newCachedThreadPool() para proporcionar agrupamiento de hilos para usted.

Cuestiones relacionadas