Требуется bean-компонент типа 'org.springframework.security.authentication.AuthenticationManager', который не может быть найден. сообщение от весенней безопасности - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь реализовать одну демонстрационную демонстрацию для весенней безопасности с весенней загрузкой для проверки аутентификации. Я пытаюсь реализовать одну базовую тренировку для обеспечения безопасности Spring и получаю следующее сообщение:

Description:

Parameter 0 of constructor in com.spacestudy.service.CustomAuthenticationProvider required a bean of type 'org.springframework.security.authentication.AuthenticationManager' that could not be found.

Action:

Consider defining a bean of type 'org.springframework.security.web.AuthenticationEntryPoint' in your configuration.

Мой класс конфигурации безопасности SecurityConfig.java,

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private AuthenticationEntryPoint authEntryPoint;

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .csrf().disable()
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .addFilter(new ApplicationContextHeaderFilter((ApplicationContext) authenticationManager()));
    }
}

И моя реализация BasicAuthenticationFilter, подобная следующей,

@Component
public class  CustomAuthenticationProvider  extends  BasicAuthenticationFilter    { 

public CustomAuthenticationProvider(AuthenticationManager authenticationManager) {
    super(authenticationManager);
    // TODO Auto-generated constructor stub
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    UsernamePasswordAuthenticationToken authentication = getAuthentication(request);
    SecurityContextHolder.getContext().setAuthentication(authentication);
    filterChain.doFilter(request, response);
}
private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
   String bearerToken = request.getHeader("accessToken");
String username = "test";
String password = "test";
    if (username != null && !username.isEmpty()) {
        return new UsernamePasswordAuthenticationToken(username, null, null);
      }
    return null;
    }
 }

Может кто-нибудь подсказать мне, чтобы решить эту проблему, если я ошибся в этом направлении?

Ответы [ 3 ]

0 голосов
/ 10 ноября 2019

Я не уверен, но CustomAuthenticationProvider implement AuthenticationProvider и AuthenticationManager - это просто контейнер для провайдеров аутентификации, и кажется, что у вас их нет. https://www.baeldung.com/spring-security-authentication-provider

0 голосов
/ 10 ноября 2019

В вашем коде много проблем.

  1. (ApplicationContext) authenticationManager()
    вы не можете преобразовать AuthenticationManager в ApplicationContext

  2. .addFilter(new ApplicationContextHeaderFilter(...))
    Я не знаю, почему вы используете ApplicationContextHeaderFilter для простого демонстрационного приложения.

    • Вы должны предпочесть BasicAuthenticationFilter или даже простую конфигурацию по умолчанию для HttpSecurity с .httpBasic()

    • Вы должны предпочесть UsernamePasswordAuthenticationFilter или даже простую конфигурацию по умолчанию, предоставленную в HttpSecurity с .formLogin()

  3. CustomAuthenticationProvider extends BasicAuthenticationFilter
    Поставщик аутентификации - это поставщик, который реализует интерфейс AuthenticationProvider. В вашем случае наименование должно быть xxxAuthFilter.

  4. Вы ничего не сделали в приведенном ниже коде. (Получил существующий объект аутентификации и восстановил его без создания действительного объекта аутентификации.)

UsernamePasswordAuthenticationToken authentication = getAuthentication(request);
SecurityContextHolder.getContext().setAuthentication(authentication);

Исходя из точки зрения реализации AuthenticationManager и AuthFilters,
Для добавления фильтра вы можете добавить любую реализацию предоставленных фильтров Spring Security, как указано ниже
.addFilter( AnyFilterImplementationFromThisLink ) (Но не все фильтры являются аутентификационными фильтрами. Где аутентификационные фильтры будут пытаться аутентифицироваться с настроенным параметром authenticationManager) Например, если вы рассматриваете UsernamePasswordAuthenticationFilter или BasicAuthenticationFilter

вы должны позаботиться о настройке AuthenticationManager, где ваш менеджер аутентификации должен переопределить метод authenticate(), и он должен вернуть Authentication объект (где Authentication объект будет иметь основной субъект аутентификации, учетные данные и список предоставленных полномочий)

Или

Если вы не хотите реализовывать менеджер аутентификации ...
In простым способом в ваших фильтрах (реализация OncePerRequestFilter) метод doFilterInternal () устанавливает объект `Authentication` в` SecurityContext`
List<GrantedAuthority> authorityList = new ArrayList<>();
GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_USER");
authorityList.add(authority);
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password, authorityList);
//Note UsernamePasswordAuthenticationToken implements Authentication
SecurityContextHolder.getContext().setAuthentication(authToken);

Как работает любой фильтр авторизации, если существует действительный объект Authentication, тоЦепочка фильтров будет продолжаться без попытки аутентификации, в противном случае она будет attemptAuthentication переопределенным методом attemptAuthentication().
Но ваш ApplicationContextHeaderFilter является реализацией OncePerRequestFilter, где у него нет attemptAuthentication(), и я не знаю порядокиз ApplicationContextHeaderFilter, если это порядок после создания контекста безопасности, тогда вы можете установить для объекта аутентификации контекст безопасности.

0 голосов
/ 02 ноября 2019

Похоже, ваша ошибка в том, что AuthenticationManager отсутствует в виде Spring Bean.

Опция 1

Зарегистрируйте AuthenticationManager в Spring Bean. Все предоставляется Spring для того, чтобы сделать это непосредственно в вашем SecurityConfig классе, переопределив метод WebSecurityConfigurerAdapter#authenticationManagerBean, как описано в документации

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

Опция 2

Старайтесь не регистрировать AuthenticationManager в Spring, но непосредственно ваш CustomAuthenticationProvider класс.

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public CustomAuthenticationProvider authenticationProvider() throws Exception {
        return new CustomAuthenticationProvider(authenticationManager());
    }
}

Не забудьте удалить аннотацию @Component в классе CustomAuthenticationProvider с помощью этого метода.

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