Действительно ли SecurityContextHolder ориентирован на многопотоковое исполнение?

Я использую 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 на другой параллельной сессии), или возможно пустой пользователь в целом.

Существует ли лучший способ получить учетные данные/профиль пользователя?

6
задан Droo 18 February 2010 в 20:25
поделиться

1 ответ

Да, это потокобезопасный со стратегией по умолчанию ( MODE_THREADLOCAL ) (пока вы не пытаетесь изменить стратегию на муха). Однако, если вы хотите, чтобы порожденные потоки наследовали SecurityContext родительского потока, вы должны установить MODE_INHERITABLETHREADLOCAL .

Также аспекты не имеют никакой «логики потоковой передачи», они выполняются в том же потоке, что и рекомендованный метод.

6
ответ дан 17 December 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: