2017-02-20 26 views
1

привет у меня есть некоторые проблемы при использовании пружины безопасности в рамках резьбыпружина безопасности текущего пользователя в потоке

System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId()); 
new Thread(() -> System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId())).start(); 

эти две строчки должны дать мне текущий идентификатор пользователя,

первую работу линии, как ожидается,

Вторая строка дает мне NullPointerException, поскольку нет текущего пользователя, это нулевое значение

Я нашел эту проблему, так как хочу сохранить много строк до t он будет использовать таблицу hava @CreatedBy, и это будет запрашивать текущего пользователя в потоке и не получится, так как это даст нулевое значение для текущего пользователя.

+1

Почему вы хотите иметь отдельный поток для получения текущий пользователь? Сделайте это, как было предложено в первом варианте. –

+0

По умолчанию объект Spring Security 'Authentication' хранится в' ThreadLocal' на основе 'Thread'. Поэтому, запуская новый поток с помощью 'new Thread', а затем пытающийся восстановить объект« Authentication »в этом новом потоке, вернется« null ». Официальная документация Spring Security предлагает [несколько опций] (http://docs.spring.io/spring-security/site/docs/current/reference/html/concurrency.html) для работы в многопоточной среде. Просмотрите документацию и выберите стратегию, подходящую для вашей среды. – manish

+1

почему у вас есть отдельный поток для получения текущего пользователя ¿, потому что я не звоню, чтобы получить текущего пользователя созданные аннотации, вызывающие его, и он вызывает его в потоке, который я создал, так что это сделано весной магии –

ответ

2

Если вы хотите, чтобы порожденные потоки наследовали SecurityContext родительского потока, вы должны установить MODE_INHERITABLETHREADLOCAL стратегии.

Обратитесь к API SecurityContextHolder.

См this слишком

2

вы можете передать SecurityContext от одного потока к другому

Runnable originalRunnable = new Runnable() { 
public void run() { 
    // invoke secured service 
} 
}; 
SecurityContext context = SecurityContextHolder.getContext(); 
DelegatingSecurityContextRunnable wrappedRunnable = 
    new DelegatingSecurityContextRunnable(originalRunnable, context); 

new Thread(wrappedRunnable).start(); 

См Параллелизм Поддержка

http://docs.spring.io/spring-security/site/docs/current/reference/html/concurrency.html

 Смежные вопросы

  • Нет связанных вопросов^_^