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.