Реализация Spring-boot OAuth2: NoSuchBeanDefinitionException: нет подходящего компонента типа AuthenticationManager - PullRequest
0 голосов
/ 29 августа 2018

org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания компонента с именем authorizationServerConfig: неудовлетворен зависимость выражается через поле «authenticationManager»; вложенными исключение org.springframework.beans.factory.NoSuchBeanDefinitionException: нет квалифицирующий боб типа 'Org.springframework.security.authentication.AuthenticationManager' доступно: ожидается по крайней мере 1 бин, который квалифицируется как autowire кандидат. Аннотации зависимостей: {@ Org.springframework.beans.factory.annotation.Autowired (обязательно = истина)}

Привет, у меня есть весеннее загрузочное веб-приложение, и я пытаюсь внедрить систему аутентификации входа / авторизации с использованием Spring Security и OAuth2, следуя этому примеру: https://www.youtube.com/watch?v=dTAgI_UsqMg&t=1307s

Все было хорошо, но когда я запускаю свое приложение, я получаю исключение, в котором говорится, что оно не может + найти бин для AuthenticationManager, даже если он думал, что оно есть и автоматически подключено.

Просматривая Интернет, это похоже на известную или распространенную проблему с Oauth2, но я не могу найти правильный обходной путь

Некоторые люди предлагали «выставить» bean-компонент AuthenticationManager, я не уверен, что это означает в этом контексте

Это ссылка на мой текущий проект на github: https://github.com/chenchi13/spring-boot-cms

Может кто-нибудь помочь мне понять это?

класс, выдающий исключение:

@EnableResourceServer
@Configuration                                                      
public class ResourceServerConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private UserDetailsService customUserDetailService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.requestMatchers()
                .antMatchers("/login", "/oauth/authorize")
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .permitAll();
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        //auth.parentAuthenticationManager(authenticationManager)
        //        .inMemoryAuthentication()
        //        .withUser("Peter")
        //        .password("peter")
        //        .roles("USER");

        auth.parentAuthenticationManager(authenticationManager)
                .userDetailsService(customUserDetailService);
    }
}

Конфигурация сервера авторизации:

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {

        security.tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()");
    }


    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients
                .inMemory()
                .withClient("ClientId")
                .secret("secret")
                .authorizedGrantTypes("authorization_code")
                .scopes("user_info")
                .autoApprove(true);
    }


    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

        endpoints.authenticationManager(authenticationManager);
    }
}

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я думаю, вам не хватает определения для authenticationManager bean. Я добавляю строки ниже, проверьте это один раз:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

   // Other Details

   @Bean
   @Override
   protected AuthenticationManager authenticationManager() throws Exception {
      return super.authenticationManager();
   }

   @Override
   protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      auth.userDetailsService(userDetailsService)
              .passwordEncoder(new ShaPasswordEncoder(encodingStrength));
   }

   @Override
   protected void configure(HttpSecurity http) throws Exception {
      http
              .sessionManagement()
              .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
              .and()
              .httpBasic()
              .realmName(securityRealm)
              .and()
              .csrf()
              .disable();

   }

 // Other Details

}

Вы можете перейти по ссылке ниже.

Ссылка: Spring Boot с JWT и OAuth2.0

Надеюсь, это поможет вам:)

0 голосов
/ 29 августа 2018

Удалить из ResourceServerConfig следующее:

@Autowired
private AuthenticationManager authenticationManager;

И измените метод настройки следующим образом:

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

Также переопределите следующий метод в ResourceServerConfig:

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

Это должно исправить вашу проблему.

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