Что такое AuthenticationManager по умолчанию в Spring -Security? Как он аутентифицируется?
У меня есть следующий bean:
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider
user-service-ref="userDetailsService" />
</sec:authentication-manager>
Я предполагаю, что здесь Spring использует некоторую реализацию по умолчанию AuthenticationManager
.
В моем коде Java я:
@Resource(name = "authenticationManager")
private AuthenticationManager authenticationManager; // specific for Spring Security
public boolean login(String username, String password) {
try {
Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
if (authenticate.isAuthenticated()) {
SecurityContextHolder.getContext().setAuthentication(authenticate);
return true;
}
}
catch (AuthenticationException e) {
}
return false;
}
Здесь вызывается AuthenticationManager.authenticate(...)
. Но я хотел бы знать, какая реализация AuthenticationManager
Spring используется по умолчанию и что ее authenticate(...)
делает для аутентификации (то есть убедитесь, что имя пользователя соответствует паролю).
Не могли бы вы объяснить это?
Ответы
Ответ 1
AuthenticationManager
на самом деле является просто контейнером для поставщиков аутентификации, предоставляя им согласованный интерфейс. В большинстве случаев значение по умолчанию AuthenticationManager
более чем достаточно.
Когда вы вызываете
.authenticate(new UsernamePasswordAuthenticationToken(username, password))`
он передает UsernamePasswordAuthenticationToken
по умолчанию AuthenticationProvider
, который будет использовать userDetailsService
, чтобы получить пользователя на основе имени пользователя и сравнить этот пароль пользователя с идентификатором в токене аутентификации.
В общем случае AuthenticationManager
передает какой-либо AuthenticationToken
каждому из них AuthenticationProviders
, и каждый из них проверяет его, и, если они могут использовать его для аутентификации, они возвращаются с указанием "Authenticated", "Неаутентифицированный" или "Не удалось аутентифицировать" (что указывает, что поставщик не знал, как обращаться с токеном, поэтому он передал его обработку).
Это механизм, который позволяет подключать другие схемы аутентификации, такие как аутентификация с сервером LDAP или Active Directory или OpenID, и является одной из основных точек расширения в рамках Spring Security.
Ответ 2
Spring Безопасность обеспечивает только одну реальную реализацию AuthenticationManager
:
org.springframework.security.authentication.ProviderManager
Для задач аутентификации используется AuthenticationProvider
другой AuthenticationProvider
AuthenticationManagerBeanDefinitionParser
отвечает за синтаксический анализ <sec:authentication-manager>
его состояний java doc:
Регистрирует центральный ProviderManager, используемый пространством имен конфигурации и позволяет конфигурировать псевдоним, позволяющий пользователи ссылаются на него в своем beans и четко видят, где имя отсюда.
Создает ProviderManager
и добавляет указанные параметры. Если в xml не указано ни одного параметра, он добавляет NullAuthenticationProvider
. Это, по крайней мере, провайдер, который отмечает, чем предотвращение конфигурационных исключений.