Безопасен ли поток SecurityContextHolder? - PullRequest
6 голосов
/ 18 февраля 2010

Я использую 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, он по умолчанию использует ThreadLocal, но у точки pointcut, похоже, также есть некая инкапсулированная логика потоков.

Возможно ли, что возможна коллизия пользователей (то есть доступ к UserA из одного сеанса для события аудита UserB в другом параллельном сеансе) или, возможно, вообще нулевой пользователь.

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

Ответы [ 3 ]

6 голосов
/ 18 февраля 2010

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

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

1 голос
/ 05 февраля 2013

В общем случае ThreadLocal не будет дружелюбным в глобальном кешированном пуле потоков. Пул потоков в кэше по умолчанию в ExecutorService (Executors.newCachedThreadPool ()) будет иметь либо хранилище ThreadLocal инициализирующего потока, либо пустое. В этой ситуации настройка MODE_INHERITABLETHREADLOCAL ничего не изменит, если только кешированный пул потоков не будет инициализирован для запроса, что будет довольно плохим его использованием. Убедитесь, что все базовые платформы или библиотеки не используют Executors.newCachedThreadPool () для обеспечения пула потоков для вас.

0 голосов
/ 29 февраля 2012

Да, это потокобезопасно. Вы должны просто звонить SecurityContextHolder.getContext (). GetAuthentication (). GetName ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...