#java #spring #spring-security
#java #spring #spring-безопасность
Вопрос:
Я читаю документацию Spring по безопасности, в ней говорится, что SecurityContextHolder предоставляет различные типы стратегий для приложений с определенным поведением потока. Например, приложения Swing.
Я понял, что в веб-приложениях мы можем использовать стратегию ThredLocal. Но когда использовать другие 2 стратегии и как они работают, я не могу понять.
Ответ №1:
Смотрите Spring Security Reference:
SecurityContextHolder, SecurityContext и объекты аутентификации
Наиболее фундаментальным объектом является
SecurityContextHolder
. Здесь мы храним сведения о текущем контексте безопасности приложения, который включает сведения о принципале, использующем приложение в данный момент. По умолчанию для хранения этих сведенийSecurityContextHolder
используетсяThreadLocal
, что означает, что контекст безопасности всегда доступен для методов в том же потоке выполнения, даже если контекст безопасности явно не передается в качестве аргумента для этих методов. ИспользованиеThreadLocal
таким образом вполне безопасно, если принять меры для очистки потока после обработки запроса текущего участника. Конечно, Spring Security позаботится об этом за вас автоматически, поэтому нет необходимости беспокоиться об этом.Некоторые приложения не совсем подходят для использования
ThreadLocal
из-за специфики их работы с потоками. Например, клиент Swing может захотеть, чтобы все потоки в виртуальной машине Java использовали один и тот же контекст безопасности.SecurityContextHolder
можно настроить стратегию при запуске, чтобы указать, как вы хотели бы сохранить контекст. Для автономного приложения вы бы использовалиSecurityContextHolder.MODE_GLOBAL
стратегию. Другие приложения могут захотеть, чтобы потоки, порожденные защищенным потоком, также использовали тот же идентификатор безопасности. Это достигается с помощьюSecurityContextHolder.MODE_INHERITABLETHREADLOCAL
. Вы можете изменить режим по умолчаниюSecurityContextHolder.MODE_THREADLOCAL
двумя способами. Первый — установить системное свойство, второй — вызвать статический метод наSecurityContextHolder
. Большинству приложений не потребуется изменять настройки по умолчанию, но если вы это сделаете, взгляните на JavaDoc, чтобыSecurityContextHolder
узнать больше.