Spring Security/Ключевые сервисы Spring Security: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 9:
<code>AuthenticationManager</code> это просто интерфейс, поэтому реализация может быть какой угодно, в зависимости от нашего выбора, но как это работает на практике? Что делать, если нам нужно использовать несколько баз данных с аутентификационной информацией, или сочетание различных сервисов аутентификации, таких как база данных и сервер LDAP?
 
Реализация по умолчанию в Spring Security называется <code>ProviderManager</code> и вместо того, чтобы самостоятельно обрабатывать аутентификационный запрос, он делегирует это списку настроенных <code>AuthenticationProvider</code>'ов, каждый из которых в свою очередь запрашивается, может ли он выполнить аутентификацию. Каждый провайдер либо сгенерирует исключение, либо вернет полностью заполненный объект <code>Authentication</code>. Помните наших хороших друзей, <code>UserDetails</code> и <code>UserDetailsService</code>? Если нет, то вернитесь к предыдущей главе, и освежите память. Наиболее распространенный подход к проверке аутентификационного запроса это, загрузить соответствующий <code>UserDetails</code> и сверить загруженные пароль с тем, что был введен пользователем. Это подход используется <code>DaoAuthenticationProvider</code> (см. ниже). Загруженный <code>UserDetails</code> объект - и в частности <code>GrantedAuthority</code> в нем - будут использоваться при создании полностью заполненного объекта <code>Authentication</code>, который возвращается в случае успешной аутентификации и сохраняется в <code>SecurityContext</code>.
 
Если вы используете конфигурирование с помощью пространства имен, то экземпляр <code>ProviderManager</code> создается и поддерживается автоматически, и вы только добавляете провайдеров аутентификации с помощью элементов пространства имен(см. Главу «Пространство имен»). В этом случае, вы не должны объявлять bean для <code>ProviderManager</code> в контексте приложения. Однако, если вы не используете пространство имен, то вы должны объявить его следующим образом: