Spring Security для борьбы с галантерейными товарами: понимание AuthenticationManager

Spring Boot Java

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Я считаю, что процесс инициализации может помочь вам прочитать соответствующий исходный код:

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Он становится учетными данными и инициирует успешное событие аутентификации. Если аутентификация завершается неудачно, генерируется исключение, вызывающее событие сбоя аутентификации.

ProviderManager的认证流程

Отсюда мы видим, что менеджер аутентификацииAuthenticationManagerдля конкретногоAuthenticationПредоставляет определенную функцию аутентификации, мы можем использовать ее для реализации сосуществования нескольких аутентификаций.

4. Резюме

Благодаря этой статье мыSpring SecurityМенеджер аутентификацииAuthenticationManagerАнализируются процесс инициализации и процесс аутентификации, если вы знакомы сAuthenticationManagerЛогика может реализовать сосуществование нескольких методов аутентификации и других возможностей, а также реализовать много полезной логики, что очень важно для интеграции.Spring Securityочень важно для проекта. Уделять больше внимания:Код Фермер Маленький Толстый БратПолучите больше оригинальных галантерейных товаров.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn