1. Введение
насПредыдущийпредставилUsernamePasswordAuthenticationFilter
рабочего процесса, оставив небольшое предзнаменование в качествеServlet Filterдолжно бытьdoFilter
Метод реализации, но это, по сути, не его родительский классAbstractAuthenticationProcessingFilter
Предусмотрены конкретные реализации. Позже мы представим сегодняшнего главного героя на основе этой реализации.AuthenticationManager
, чтобы продолжить процесс аутентификации пользователя.
2. AbstractAuthenticationProcessingFilter
ПосмотримAbstractAuthenticationProcessingFilter
основной методdoFilter
Реализация:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 先通过请求的uri来判断是否需要认证,比如默认的/login
if (!requiresAuthentication(request, response)) {
chain.doFilter(request, response);
return;
}
if (logger.isDebugEnabled()) {
logger.debug("Request is to process authentication");
}
Authentication authResult;
try {
// 接着就是执行子类钩子方法attemptAuthentication来获取认证结果对象Authentication ,这个对象不能是空 否则直接返回
authResult = attemptAuthentication(request, response);
if (authResult == null) {
// return immediately as subclass has indicated that it hasn't completed
// authentication
return;
}
// 处理session 策略,这里默认没有任何策略
sessionStrategy.onAuthentication(authResult, request, response);
}
catch (InternalAuthenticationServiceException failed) {
logger.error(
"An internal error occurred while trying to authenticate the user.",
failed);
// 如果遇到异常 就会交给认证失败处理器 AuthenticationFailureHandler 来处理
unsuccessfulAuthentication(request, response, failed);
return;
}
catch (AuthenticationException failed) {
// Authentication failed
unsuccessfulAuthentication(request, response, failed);
return;
}
// 认证成功后继续其它过滤器链 并最终交给认证成功处理器 AuthenticationSuccessHandler 处理
if (continueChainBeforeSuccessfulAuthentication) {
chain.doFilter(request, response);
}
successfulAuthentication(request, response, chain, authResult);
}
Большая часть логики здесь ясна, ключ лежит вattemptAuthentication
Метод, который мы разобрали в предыдущей статье, заключается вAuthenticationManager
изauthenticate
метод для обработки логики аутентификации, затем мы сосредоточимся на анализе этого интерфейса, чтобы помочь нам понятьSpring Seucirtyпроцесс сертификации.
3. AuthenticationManager
AuthenticationManager
Этот метод интерфейса очень своеобразный, типы входных параметров и возвращаемых значений обаAuthentication
. Функция этого интерфейса заключается в аутентификации ненадежных учетных данных пользователя.Если аутентификация пройдена, будут возвращены учетные данные доверенного состояния.В противном случае будет выдано исключение аутентификации.AuthenticationException
.
3.1 Процесс инициализации AuthenticationManager
ТакAbstractAuthenticationProcessingFilter
серединаAuthenticationManager
Где это настраивается? ВидимыйПрактичная серия галантереи Spring Securityдолжен знатьWebSecurityConfigurerAdapter
серединаvoid configure(AuthenticationManagerBuilder auth)
это конфигурацияAuthenticationManager
, я резюмировал это на основе исходного кодаAuthenticationManager
Я считаю, что процесс инициализации может помочь вам прочитать соответствующий исходный код:
Следует отметить, что если мы используем пользовательскую конфигурацию, мы не должны следовать примеру ошибки, подобному следующему:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(weChatSecurityConfigProperties.getUserDetailsService());
daoAuthenticationProvider.setPasswordEncoder(multiPasswordEncoder());
auth.authenticationProvider(daoAuthenticationProvider);
// 调用 super 将导致不生效 所以下面语句不要写
super.configure(auth);
}
3.2 Процесс аутентификации AuthenticationManager
AuthenticationManager
реализацияProviderManager
управлял многимиAuthenticationProvider
. КаждыйAuthenticationProvider
поддерживают только определенные типыAuthentication
, будет пропущен, если не поддерживается. Другая функция – адаптироватьAuthentication
Для аутентификации, пока одна из аутентификаций успешна, аутентификация считается успешной, а если все они терпят неудачу, аутентификация считается неудачной. После успешной аутентификацииAuthentication
Он становится учетными данными и инициирует успешное событие аутентификации. Если аутентификация завершается неудачно, генерируется исключение, вызывающее событие сбоя аутентификации.
Отсюда мы видим, что менеджер аутентификацииAuthenticationManager
для конкретногоAuthentication
Предоставляет определенную функцию аутентификации, мы можем использовать ее для реализации сосуществования нескольких аутентификаций.
4. Резюме
Благодаря этой статье мыSpring SecurityМенеджер аутентификацииAuthenticationManager
Анализируются процесс инициализации и процесс аутентификации, если вы знакомы сAuthenticationManager
Логика может реализовать сосуществование нескольких методов аутентификации и других возможностей, а также реализовать много полезной логики, что очень важно для интеграции.Spring Securityочень важно для проекта. Уделять больше внимания:Код Фермер Маленький Толстый БратПолучите больше оригинальных галантерейных товаров.
关注公众号:Felordcn获取更多资讯