Spring Security WebSecurityConfigurerAdapter: AuthenticationManagerBuilder - переопределить метод настройки или autowire globalUserDetails? - PullRequest
0 голосов
/ 10 апреля 2020

Уважаемое сообщество: я пишу это, чтобы спросить, как мне настроить AuthenticationManagerBuilder .

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
  @Autowired
  private UserDetailsService secUserDetailsService;

  @Autowired
  private PasswordEncoder secPasswordEncoder;

  . . .

  @Bean
  @Override
  public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
  }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      auth.authenticationProvider(authenticationProvider());
  }

  @Autowired
  public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(secUserDetailsService).passwordEncoder(secPasswordEncoder);
  }

  @Bean
  public DaoAuthenticationProvider authenticationProvider() {
    DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
    authenticationProvider.setUserDetailsService(secUserDetailsService);
    authenticationProvider.setPasswordEncoder(secPasswordEncoder);
    return authenticationProvider;
  }
}

Какая реализация должна быть в промежутке между

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      auth.authenticationProvider(authenticationProvider());
  }

и

  @Autowired
  public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(secUserDetailsService).passwordEncoder(secPasswordEncoder);
  }

Кроме того, я обнаружил, что если я прокомментирую метод '@ Override protected void configure (AuthenticationManagerBuilder auth) , мое приложение будет работать хорошо, но когда я прокомментировал @Autowired publi c void globalUserDetails (AuthenticationManagerBuilder auth) , произошла следующая ошибка:

o.s.s.o.p.endpoint.TokenEndpoint.handleException:169 - Handling error: IllegalStateException, UserDetailsService is required.
java.lang.IllegalStateException: UserDetailsService is required.
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:464)
    at org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper.loadUserDetails(UserDetailsByNameServiceWrapper.java:68)
    at org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider.authenticate(PreAuthenticatedAuthenticationProvider.java:103)
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:175)
...

Какой метод мне следует использовать? Кроме того (это моя самая большая проблема) есть ли проблемы с производительностью , если я использую оба?

1 Ответ

0 голосов
/ 10 апреля 2020

согласно этому руководству

разница между использованием

@Override configure(AuthenticationManagerBuilder auth)

и

an @Autowired AuthenticationManagerBuilder в методе

заключается в том, что первый создает локальный AuthenticationManager, который делегирует родительскому элементу Spring-Security по умолчанию AuthenticationManager, если он не может обработать запрос аутентификации, тогда как последний (с использованием @Autowired) настраивает новый глобальный экземпляр AuthenticationManager.

Таким образом, использование globalUserDetails совершенно нормально, но нет необходимости использовать оба, так как вы создадите локальный, который делегирует то же самое, что и родитель, что бесполезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...