Io uso SecurityContextHolder
e un costume UserDetailsService
per ottenere UserDetails
da SecurityContextHolder
:È sicuro il thread SecurityContextHolder?
Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetailsDTO user = (UserDetailsDTO) o;
ho lasciato i controlli nulli, ecc, ma questa è l'idea. Sto usando questo in un @Around
pointcut di un @Aspect
:
@Around("execution(* user.service.*.*(..))")
public Object audit(ProceedingJoinPoint call) throws Throwable {
// get user id
// add audit row in db
}
Guardando la classe SecurityContextHolder
, utilizza una ThreadLocal
per impostazione predefinita, ma la roba pointcut sembra anche avere una sorta di logica filettatura incapsulato.
È possibile che si verifichi una collisione tra utenti (ad esempio, accesso a UtenteA da una sessione per un evento di controllo UtenteB in un'altra sessione concorrente) o eventualmente un utente null.
C'è un modo migliore per ottenere le credenziali/profilo utente?
L'ho visto, ma l'uomo sembra un enorme errore per i ragazzi della Primavera. Una classe util statica e setStrategyName ha questo file Javadoc: 'NON chiamare questo metodo più di una volta per una data JVM, poiché reinizializzerà la strategia e influirà negativamente su qualsiasi thread esistente utilizzando la vecchia strategia. Penso che probabilmente finiscono per creare una classe wrapper singleton. – Droo
Immagino ci sia anche una proprietà di sistema: 'public static final String SYSTEM_PROPERTY =" spring.security.strategy ";' – Droo