Я использую SecurityContextHolder
и пользовательское UserDetailsService
получить UserDetails
от SecurityContextHolder
:
Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetailsDTO user = (UserDetailsDTO) o;
Я не учел пустые проверки, и т.д., но это - идея. Я использую это в @Around
pointcut @Aspect
:
@Around("execution(* user.service.*.*(..))")
public Object audit(ProceedingJoinPoint call) throws Throwable {
// get user id
// add audit row in db
}
Взгляд на SecurityContextHolder
класс, это использует a ThreadLocal
по умолчанию, но материал pointcut также, кажется, имеет своего рода инкапсулированную логику поточной обработки.
Действительно ли возможно, что могла быть пользовательская коллизия (т.е. доступ Усера от одной сессии для события аудита UserB на другой параллельной сессии), или возможно пустой пользователь в целом.
Существует ли лучший способ получить учетные данные/профиль пользователя?
Да, это потокобезопасный со стратегией по умолчанию ( MODE_THREADLOCAL
) (пока вы не пытаетесь изменить стратегию на муха). Однако, если вы хотите, чтобы порожденные потоки наследовали SecurityContext
родительского потока, вы должны установить MODE_INHERITABLETHREADLOCAL
.
Также аспекты не имеют никакой «логики потоковой передачи», они выполняются в том же потоке, что и рекомендованный метод.