Spring Security/Технический обзор Spring Security: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 14:
 
== Объекты SecurityContextHolder, SecurityContext и Authentication ==
Самым фундаментальным явлется <code>SecurityContextHolder</code>. В нем мы храним информацию о текущем контексте безопасности приложения, который включает в себя подробную информацию о доверителе (принципале/пользователе) работающем в настоящее время с приложением. По умолчанию <code>SecurityContextHolder</code> использует <code>ThreadLocal</code> для хранения такой информации, что означает, что контекст безопасности всегда доступен для методов исполняющихся в том же самом потоке, даже если контекст безопасности явно не передается в качестве аргумента этих методов. Использование <code>ThreadLocal</code> таким образом, вполне безопасно, если принимаются меры для очистки потока после завершения обработки запроса текущего доверителя. Естественно Spring Security автоматически делает это за вас автоматически, поэтому нет необходимости беспокоиться об этом.
 
В некоторых приложениях использование <code>ThreadLocal</code> не является удачным решением, в силу их специфики работы с потоками. Например, клиент Swing может захотеть чтобы все потоки Java-мешины использовали один и тот же контекст безопасности. <code>SecurityContextHolder</code> может быть настроен во время запуска с помощью специальной стратегии, чтобы вы могли определить как будет храниться контекст безопасности. Для одиночного приложения вы можете использовать стратегию <code>SecurityContextHolder.MODE_GLOBAL</code>. Другие приложения могут захотеть иметь потоки порожденные от одного защищенного потока, предполагая наличие аналогичной безопасности. Это достигается путем использования <code>SecurityContextHolder.MODE_INHERITABLETHREADLOCAL</code>. Вы можете изменить режим по умолчанию <code>SecurityContextHolder.MODE_THREADLOCAL</code> двумя способами. Первый, установить соответствующее свойство системы, второй, вызовать статический метод класса <code>SecurityContextHolder</code>. Большинству приложений не требуется менять значение по умолчанию, в противном случае, чтобы узнать больше, изучите Javadocs для <code>SecurityContextHolder</code>.