привет у меня есть некоторые проблемы при использовании пружины безопасности в рамках резьбыпружина безопасности текущего пользователя в потоке
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, и это будет запрашивать текущего пользователя в потоке и не получится, так как это даст нулевое значение для текущего пользователя.
Почему вы хотите иметь отдельный поток для получения текущий пользователь? Сделайте это, как было предложено в первом варианте. –
По умолчанию объект 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
почему у вас есть отдельный поток для получения текущего пользователя ¿, потому что я не звоню, чтобы получить текущего пользователя созданные аннотации, вызывающие его, и он вызывает его в потоке, который я создал, так что это сделано весной магии –