Spring безопасность AuthenticationManager vs AuthenticationProvider?
Может ли кто-нибудь сказать мне разницу между AuthenticationManager
и AuthenticationProvider
в Spring Безопасность?
Как они используются и как они называются. Насколько я понимаю, a SecurityFilter
вызывает AuthenticationManager
для аутентификации объекта Authentication
? Но тогда, когда вступает в игру AuthenticationProvider
?
Спасибо!
Ответы
Ответ 1
Я думаю, что AuthenticationManager
делегирует выборку постоянной информации пользователя одному или нескольким AuthenticationProvider
s. Поставщики аутентификации (например, DaoAuthenticationProvider, JaasAuthenticationProvider, LdapAuthenticationProvider, OpenIDAuthenticationProvider
) специализируются на доступе к конкретным репозиториям пользовательской информации.
Что-то еще упоминается в этой части справочного руководства. В нем говорится:
Возможно, вы захотите зарегистрировать дополнительный AuthenticationProvider beans с помощью ProviderManager, и вы можете сделать это, используя элемент с атрибутом ref, где значение атрибута - это имя поставщика bean, которое вы хотите добавить.
Другими словами, вы можете указать несколько AuthenticationProviders, например, тот, который ищет пользователей в базе данных LDAP, а другой - в базе данных SQL.
Ответ 2
Из spring reference
AuthenticationManager - это просто интерфейс, поэтому реализация может быть любой, что мы выбираем
Реализация по умолчанию в spring Security называется ProviderManager и вместо обработки самого запроса на аутентификацию, она делегирует список настроенных параметров AuthenticationProvider s, каждый из которых в свою очередь запрашивает, может ли он выполнять аутентификацию. Каждый поставщик либо выдает исключение, либо возвращает полностью заполненный объект аутентификации.
Также, если вы проверяете исходный код для AuthenticationManager, ProviderManager и AuthenticationProvider, вы можете это четко видеть.
ProviderManager реализует интерфейс AuthenticationManager и имеет список AuthenticationProviders. Поэтому, если вы хотите иметь настраиваемый механизм аутентификации, вам нужно будет внедрить новый AuthenticationProvider.