Spring Security передбачає пакет, здатний делегувати запити на аутентифікацію сервісу Аутентифікації та Авторизації Java (JAAS). Цей пакет описано нижче.
AbstractJaasAuthenticationProvider
AbstractJaasAuthenticationProvider
є основою для передбачених реалізацій
AuthenticationProvider
у JAAS. Підкласи повинні реалізувати метод, який створює
LoginContext
. AbstractJaasAuthenticationProvider
має низку залежностей, які можуть бути
введені до нього та описані нижче.
JAAS CallbackHandler
Більшості LoginModule
з JAAS потрібен якийсь тип зворотного виклику. Ці зворотні дзвінки зазвичай
використовуються для отримання імені користувача та пароля від користувача.
При розгортанні з використанням Spring Security, Spring Security відповідає за цю взаємодію з користувачем (через
механізм автентифікації). Таким чином, на момент передачі запиту аутентифікації в JAAS, механізм аутентифікації
Spring Security вже повністю заповнить об'єкт Authentication
, що містить всю інформацію, необхідну
LoginModule
з JAAS.
Тому пакет JAAS для Spring Security містить два стандартні обробники зворотних викликів, JaasNameCallbackHandler
та JaasPasswordCallbackHandler
. Кожен із цих обробників зворотного виклику реалізує JaasAuthenticationCallbackHandler
.
У більшості випадків ці обробники зворотного виклику можна просто використовувати і не розумітися на їх внутрішній
механіці.
Для тих, хто потребує повного контролю над логікою роботи зворотного виклику, на внутрішньому рівні AbstractJaasAuthenticationProvider
обгортає ці екземпляри JaasAuthenticationCallbackHandler
за допомогою InternalCallbackHand
.
InternalCallbackHandler
— це клас, який фактично реалізує звичайний інтерфейс
CallbackHandler
з JAAS. При кожному використанні LoginModule
з JAAS йому передається
список екземплярів InternalCallbackHandler
, налаштованих у контексті програми. Якщо
LoginModule
просить зворотній виклик для InternalCallbackHandlers
, зворотний виклик, у
свою чергу, передається екземплярам, що обертаються JaasAuthenticationCallbackHandler
.
JAAS AuthorityGranter
JAAS працює із принципалами. У JAAS навіть "ролі" представлені у вигляді принципалів. Spring Security, з іншого боку,
працює з об'єктами Authentication
. Кожен об'єкт Authentication
містить один принципал і
кілька GrantedAuthority
. Щоб спростити зіставлення між цими різними поняттями, пакет JAAS у Spring
Security містить інтерфейс AuthorityGranter
.
AuthorityGranter
відповідає за перевірку принципала JAAS і повертає набір String
, які мають
повноваження, передані принципалу. Для кожного повернутого рядка дозволів,
AbstractJaasAuthenticationProvider
створює JaasGrantedAuthority
(який реалізує інтерфейс
GrantedAuthority
зі Spring Security), що містить рядок повноважень і принципала
AuthorityGranter
. AbstractJaasAuthenticationProvider
отримує принципалів JAAS, спочатку
успішно аутентифікуючи облікові дані користувача за допомогою LoginModule
з JAAS, а потім звертаючись
до LoginContext
, що повертається. Виконується виклик
LoginContext.getSubject().getPrincipals()
, при цьому кожен отриманий принципал передається кожному
AuthorityGranter
, визначеному у властивості AbstractJaasAuthenticationProvider.setAuthorityGranters(List)
.
Spring Security не містить жодних виробничих AuthorityGranters
, оскільки кожен принципал JAAS має
специфічне для конкретної реалізації значення. Однак у модульних тестах є TestAuthorityGranter
, який
наочно демонструє роботу простої реалізації AuthorityGranter
.
DefaultJaasAuthenticationProvider
DefaultJaasAuthenticationProvider
дозволяє впровадити в нього JAAS-об'єкт Configuration
як
залежність. Потім він створює LoginContext
, використовуючи впроваджену Configuration
з
JAAS. Це означає, що DefaultJaasAuthenticationProvider
не пов'язаний з якоюсь конкретною реалізацією
Configuration
, як JaasAuthenticationProvider
.
InMemoryConfiguration
Щоб спростити впровадження Configuration
у DefaultJaasAuthenticationProvider
, за
замовчуванням передбачена реалізація, що розміщується в оперативній пам'яті, з ім'ям
InMemoryConfiguration
. Конструктор реалізації приймає Map
, в якій кожен ключ представляє
ім'я конфігурації входу в систему, а значення — Array
, що складається з
AppConfigurationEntry
. InMemoryConfiguration
також підтримує стандартний
Array
, що складається з об'єктів AppConfigurationEntry
, який буде використаний, якщо не
буде знайдено відображення у зазначеній Map
. За подробицями звернися до javadoc на рівні класів за
InMemoryConfiguration
.
Приклад конфігурації DefaultJaasAuthenticationProvider
Хоча конфігурація Spring для InMemoryConfiguration
може бути більш перевантаженою, ніж стандартні
конфігураційні JAAS-файли, її використання в поєднанні з DefaultJaasAuthenticationProvider
є більш
гнучким, ніж використання JaasAuthentica
, оскільки вона не залежить від стандартної реалізації Configuration
.
Нижче наведено приклад конфігурації DefaultJaasAuthenticationProvider
за допомогою InMemoryConfiguration
.
Зверни увагу, що кастомні реалізації Configuration
з легкістю можна впровадити і в DefaultJaasAuthenticationProvider
.
<bean id="jaasAuthProvider"
class="org.springframework.security.authentication.jaas.DefaultJaasAuthenticationProvider">
<property name="configuration">
<bean class="org.springframework.security.authentication.jaas.memory.InMemoryConfiguration">
<constructor-arg>
<map>
<!--
SPRINGSECURITY є loginContextName за умовчанням
для AbstractJaasAuthenticationProvider
-->
<entry key="SPRINGSECURITY">
<array>
<bean class="javax.security.auth.login.AppConfigurationEntry">
<constructor-arg value="sample.SampleLoginModule" />
<constructor-arg>
<util:constant static-field=
"javax.security.auth.login.AppConfigurationEntry$LoginModuleControlFlag.REQUIRED"/>
</constructor-arg>
<constructor-arg>
<map></map>
</constructor-arg>
</bean>
</array>
</entry>
</map>
</constructor-arg>
</bean>
</property>
<property name="authorityGranters">
<list>
<!-- Необхідно буде написати власну реалізацію AuthorityGranter -->
<bean class="org.springframework.security.authentication.jaas.TestAuthorityGranter"/>
</list>
</property>
</bean>
JaasAuthenticationProvider
JaasAuthenticationProvider
передбачає, що стандартна Configuration
є екземпляром ConfigFile. Таке припущення робиться для того, щоб робити спроби оновити
Configuration
. Потім JaasAuthenticationProvider
використовує стандартну Configuration
для створення LoginContext
.
Припустимо, що у нас є конфігураційний JAAS-файл для входу в систему, /WEB-INF/login.conf
, з таким
вмістом:
JAASTest {
sample.SampleLoginModule required;
};
Як і всі біни Spring Security, JaasAuthenticationProvider
конфігурується через контекст програми.
Наступні визначення відповідатимуть наведеному вище конфігураційному JAAS-файлу входу до системи:
<bean id="jaasAuthenticationProvider"
class="org.springframework.security.authentication.jaas.JaasAuthenticationProvider">
<property name="loginConfig" value="/WEB-INF/login.conf"/>
<property name="loginContextName" value="JAASTest"/>
<property name="callbackHandlers">
<list>
<bean
class="org.springframework.security.authentication.jaas.JaasNameCallbackHandler"/>
<bean
class="org.springframework.security.authentication.jaas.JaasPasswordCallbackHandler"/>
</list>
</property>
<property name="authorityGranters">
<list>
<bean class="org.springframework.security.authentication.jaas.TestAuthorityGranter"/>
</list>
</property>
</bean>
Виконання як Subject
JaasApiIntegrationFilter
— якщо додано до конфігурації — намагатиметься виконуватися як
Subject
для JaasAuthenticationToken
. Це означає, що доступ до Subject
можна
отримати за допомогою:
Subject subject = Subject.getSubject(AccessController.getContext());
Цю інтеграцію можна легко конфігурувати за допомогою атрибуту jaas-api-provision. Ця функція корисна при інтеграції з застарілими або зовнішніми API, які ґрунтуються на заповненні суб'єкта JAAS.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ