utilizo SecurityContextHolder
y una costumbre para obtener UserDetailsService
UserDetails
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?
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
Supongo que también hay una propiedad del sistema: 'public static final String SYSTEM_PROPERTY = "spring.security.strategy"; ' – Droo