В настраиваемом классе безопасности отсутствует диспетчер аутентификации - PullRequest
0 голосов
/ 10 июля 2020

У меня есть фляга безопасности, которую я использую в своем проекте. Я расширяю BasicSecurityConfig, который расширяет WebSecurityConfigurerAdapter и содержит все фильтры. Мне сказали, что все, что мне нужно, это расширить BasicSecurityConfig и вызвать super().configure, который вызовет родительский метод configure. Однако я получаю эту ошибку:

Field authenticationManager in com.custom.security.CustomSecurityFilter required a bean of type 'org.springframework.security.authentication.AuthenticationManager' that could not be found.

В родительском классе уже есть bean-компонент AuthenticationManager, мне не нужно определять его и в дочернем классе.

My Security Класс

    public class SecurityConfiguration extends BasicSecurityConfig {

    private static final String PAYMONEYROLE = "(hasRole('EE'))";

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // must call super first
        super.configure(http);
        http.authorizeRequests()
                .antMatchers(HttpMethod.POST, "/v1/cart/validate").authenticated()
                .antMatchers(HttpMethod.POST, "/v1/cart/validate").access(PAYMONEYROLE)
                .and().cors().and().csrf().disable();
    }
    @Bean
    public FilterRegistrationBean invalidResourceFilterRegistration(InvalidResourceFilter invalidResourceFilter) {
        FilterRegistrationBean registration = new FilterRegistrationBean(invalidResourceFilter);
        registration.setEnabled(false);
        invalidResourceFilter.setDisabled(true);
        return registration;
    }

    @Bean
    public FilterRegistrationBean customSecurityFilterRegistration(CustomSecurityFilter customSecurityFilter) {
        FilterRegistrationBean registration = new FilterRegistrationBean(customSecurityFilter);
        registration.setEnabled(false);

        return registration;
    }
   
}

Custom Security Банка

    public class BasicSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private ApplicationContext applicationContext;
    @Autowired
    private InvalidResourceFilter invalidResourceFilter;

    public BasicSecurityConfig() {
    }

    protected void configure(HttpSecurity http) throws Exception {
        ((HttpSecurity)((HttpSecurity)http.addFilterBefore(this.customSecurityFilter(), AbstractPreAuthenticatedProcessingFilter.class).addFilterAfter(this.invalidResourceFilter, FilterSecurityInterceptor.class).sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()).exceptionHandling().authenticationEntryPoint(this.authenticationEntryPoint()).accessDeniedHandler(this.customDeniedHandler()).and()).authorizeRequests().accessDecisionManager(this.accessDecisionManager());
    }

    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers(new String[]{"/docs**/**", "/swagger-ui.html**/**", "/webjars**/**", "/swagger-resources**/**", "/api-docs**/**", "/v2/api-docs**", "/version.json**"});
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(this.customAuthenticationProvider());
    }

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

    @Bean
    public DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler() {
        return new CustomWebSecurityExpressionHandler();
    }

    @Bean
    public CustomSecurityFilter customSecurityFilter() {
        return new CustomSecurityFilter();
    }

    @Bean
    public AuthenticationProvider customAuthenticationProvider() {
        return new CustomAuthenticationProvider();
    }

    @Bean
    public AuthenticationSuccessHandler customSuccessHandler() {
        return new CustomSuccessHandler();
    }

    @Bean
    public AccessDeniedHandler customDeniedHandler() {
        return new CustomAccessDeniedHandler();
    }

    @Bean
    public AuthenticationEntryPoint authenticationEntryPoint() {
        return new CustomAuthenticationEntryPoint();
    }

    @Bean
    public CustomSystemUserAuthVoter customSystemUserAuthVoter() {
        return new CustomSystemUserAuthVoter();
    }

    @Bean
    public WebExpressionVoter webExpressionVoter() {
        WebExpressionVoter wev = new WebExpressionVoter();
        wev.setExpressionHandler(this.defaultWebSecurityExpressionHandler());
        return wev;
    }

    @Bean
    public AccessDecisionManager accessDecisionManager() {
        return new ExplicitDecisionManager(Arrays.asList(this.customSystemUserAuthVoter(), this.webExpressionVoter()));
    }
}

1 Ответ

0 голосов
/ 11 июля 2020
  • Согласно вашей ошибке, в CustomSecurityFilter должно быть введено authenticationManager. Но он создается без authenticationManager, как показано ниже.
   @Bean
   public CustomSecurityFilter customSecurityFilter() {
    return new CustomSecurityFilter();
   }
  • Если вы можете изменить BasicSecurityConfig, обновите метод следующим образом:
   @Bean
   public CustomSecurityFilter customSecurityFilter() {
      //If it has a constructor which accept AuthenticationManager
      return new CustomSecurityFilter(authenticationManagerBean());
      //If it has a setter for AuthenticationManager instead
      CustomSecurityFilter filter = new CustomSecurityFilter();
      filter.setAuthenticationManager(authenticationManagerBean())
      return filter;
   }
  • Если вы не можете изменить BasicSecurityConfig, создайте его в SecurityConfiguration с помощью Primary
   @Bean
   @Primary
   public CustomSecurityFilter customSecurityFilter() {
      //If it has a constructor which accept AuthenticationManager
      return new CustomSecurityFilter(authenticationManagerBean());
      //If it has a setter for AuthenticationManager instead
      CustomSecurityFilter filter = new CustomSecurityFilter();
      filter.setAuthenticationManager(authenticationManagerBean())
      return filter;
   }
...