Когда использовать разные стратегии SecurityContextHolder?

#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 узнать больше.