Как зарегистрировать пользовательский BasicAuthenticationFilter AuthenticationProvider в Spring Boot с помощью Spring Security OAuth2

Контекст

Я разрабатываю приложение, которое позволяет аутентифицированному пользователю создавать токены носителя OAuth2 для использования с API, опубликованными организацией. Идея состоит в том, чтобы позволить пользователю самостоятельно генерировать / отзывать такие токены, аналогично персональным токенам GitHub Personal API . Затем пользователь может использовать выданные токены для получения программного доступа к защищенным ресурсам. В этой конфигурации OAuth «Клиент», «Сервер авторизации» и «Сервер ресурсов» принадлежат организации. На данный момент все эти сервисы находятся в одном и том же процессе.

С этой целью я пытаюсь поддерживать тип Предоставление пароля для владельца ресурса . Среда реализации состоит из следующего:

  • Spring Boot
  • Spring Security OAuth2

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

Проблема

Из-за ограничения, связанного с отсутствием доступа к сохраненному паролю, сконфигурированный по умолчанию DaoAuthenticationProvider не может использоваться, так как он требует доступа к паролю, предоставленному объектом UserDetails, возвращаемым провайдером. UserDetailsService.

Я предполагаю, что мне нужно будет заменить это AuthenticationProvider пользовательской реализацией. Тем не менее, все попытки сделать это, похоже, не вступают в силу.

Кажется, что следующее правильно регистрируется в ссылке parent AuthenticationManager, но не делегируется во время выполнения (из-за приоритета DaoAuthenticationProvider):

@Configuration
public class SecurityConfig extends GlobalAuthenticationConfigurerAdapter {

  @Override
  public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(new AuthenticationProvider() {

      @Override
      public boolean supports(Class authentication) {
        // For testing this is easier, but should check for UsernamePasswordAuthentication.class
        return true;
      }

      @Override
      public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        // Perform custom logic...
        return authentication;
      }

    });
  }

}

Кажется, нет Что бы я ни пытался (см. ссылки ниже), я всегда получаю следующих двух провайдеров в ProviderManager, когда BasicAuthenticationFilter вызывает Authentication authResult = authenticationManager.authenticate(authRequest) в его методе doFilter:

[ org.springframework.security.authentication.AnonymousAuthenticationProvider@366815e4, org.springframework.security.authentication.dao.DaoAuthenticationProvider@5da3e311 ]

Я считаю, что это может быть следствием метода AuthorizationServerSecurityConfigurer clientCredentialsTokenEndpointFilter. Однако этот класс помечен как final и поэтому не может быть настроен.

Любые предложения или указатели будут с благодарностью.

Ресурсы

Вещи, которые я пробовал / исследовал:

10
задан Community 23 May 2017 в 11:53
поделиться