Spring Security - WebSecurityConfig required a single bean, but 6 were found

209 Views Asked by At

I have the following directories and files structure:

  • src

    • main

      • java

        • casSecuredApp

          • config

            • WebSecurityConfig.java
          • controller

            • AuthController.java

            • IndexController.java

            • SecuredController.java

          • CasSecuredAppApplication.java

WebSecurityConfig:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    private Logger logger = LoggerFactory.getLogger(WebSecurityConfig.class);
    private Filter singleSignOutFilter;
    private LogoutFilter logoutFilter;
    private CasAuthenticationProvider casAuthenticationProvider;
    private ServiceProperties serviceProperties;

    @Autowired
    public WebSecurityConfig(Filter singleSignOutFilter, LogoutFilter logoutFilter,
                             CasAuthenticationProvider casAuthenticationProvider,
                             ServiceProperties serviceProperties) {
        this.logoutFilter = logoutFilter;
        this.singleSignOutFilter = singleSignOutFilter;
        this.serviceProperties = serviceProperties;
        this.casAuthenticationProvider = casAuthenticationProvider;
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests().requestMatchers( "/secured", "/login").authenticated()
                .and()
                .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint())
                .and()
                .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class)
                .addFilterBefore(logoutFilter, LogoutFilter.class)
                .csrf().ignoringRequestMatchers("/exit/cas");
        return http.build();
    }

    @Autowired
    void registerProvider(AuthenticationManagerBuilder auth) {
        auth.authenticationProvider(casAuthenticationProvider);
    }

    @Bean
    AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

    public AuthenticationEntryPoint authenticationEntryPoint() {
        CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();
        entryPoint.setLoginUrl("https://localhost:8443/cas/login");
        entryPoint.setServiceProperties(serviceProperties);
        return entryPoint;
    }
}

CasSecuredAppApplication

@SpringBootApplication
public class CasSecuredAppApplication {

    private static final Logger logger = LoggerFactory.getLogger(CasSecuredAppApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(CasSecuredAppApplication.class, args);
    }

    @Bean
    public CasAuthenticationFilter casAuthenticationFilter(
            AuthenticationManager authenticationManager,
            ServiceProperties serviceProperties) throws Exception {
        CasAuthenticationFilter filter = new CasAuthenticationFilter();
        filter.setAuthenticationManager(authenticationManager);
        filter.setServiceProperties(serviceProperties);
        return filter;
    }

    @Bean
    public ServiceProperties serviceProperties() {
        logger.info("service properties");
        ServiceProperties serviceProperties = new ServiceProperties();
        serviceProperties.setService("http://cas-client:8900/login/cas");
        serviceProperties.setSendRenew(false);
        return serviceProperties;
    }

    @Bean
    public TicketValidator ticketValidator() {
        return new Cas30ServiceTicketValidator("https://localhost:8443");
    }

    @Bean
    public CasAuthenticationProvider casAuthenticationProvider(
            TicketValidator ticketValidator,
            ServiceProperties serviceProperties) {
        CasAuthenticationProvider provider = new CasAuthenticationProvider();
        provider.setServiceProperties(serviceProperties);
        provider.setTicketValidator(ticketValidator);
        provider.setUserDetailsService(
                s -> new User("test", "test", true, true, true, true,
                        AuthorityUtils.createAuthorityList("ROLE_ADMIN")));
        provider.setKey("CAS_PROVIDER_LOCALHOST_8900");
        return provider;
    }


    @Bean
    public SecurityContextLogoutHandler securityContextLogoutHandler() {
        return new SecurityContextLogoutHandler();
    }

    @Bean
    public LogoutFilter logoutFilter() {
        LogoutFilter logoutFilter = new LogoutFilter("https://localhost:8443/logout", securityContextLogoutHandler());
        logoutFilter.setFilterProcessesUrl("/logout/cas");
        return logoutFilter;
    }

    @Bean
    public SingleSignOutFilter singleSignOutFilter() {
        SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
        singleSignOutFilter.setLogoutCallbackPath("/exit/cas");
        singleSignOutFilter.setIgnoreInitConfiguration(true);
        return singleSignOutFilter;
    }
}

I am not able to start and use this spring boot application, because I always get different exceptions.

The current problem that I have is the following error message:

Parameter 0 of constructor in casSecuredApp.casSecuredApp.config.WebSecurityConfig required a single bean, but 6 were found:
    - springSecurityFilterChain: defined by method 'springSecurityFilterChain' in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]
    - casAuthenticationFilter: defined by method 'casAuthenticationFilter' in casSecuredApp.CasSecuredAppApplication
    - logoutFilter: defined by method 'logoutFilter' in casSecuredApp.CasSecuredAppApplication
    - requestContextFilter: defined by method 'requestContextFilter' in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]
    - formContentFilter: defined by method 'formContentFilter' in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.class]
    - characterEncodingFilter: defined by method 'characterEncodingFilter' in class path resource [org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguratio

What do I need to change in the above code to remove this error message?

0

There are 0 best solutions below