복붙노트

[SPRING] javacfig에서 'springSecurityFilterChain'이라는 Bean이 정의되지 않았습니다.

SPRING

javacfig에서 'springSecurityFilterChain'이라는 Bean이 정의되지 않았습니다.

스프링 보안을 추가하는 데 문제가 있습니다. 'springSecurityFilterChain'이라는 bean을 정의하지 않았습니다.

public class WebInitializer implements WebApplicationInitializer {

    public void onStartup(ServletContext servletContext) throws ServletException {


        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(App.class);
        servletContext.addListener(new ContextLoaderListener(rootContext));


       // security filter
        servletContext.addFilter(
                "springSecurityFilterChain",
                new DelegatingFilterProxy("springSecurityFilterChain"))
                .addMappingForUrlPatterns(null, false, "/*");

        // Manage the lifecycle of the root application context
        AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
        webContext.register(WebConfig.class);
        webContext.setServletContext(servletContext);


        ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(webContext));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
    }
}

보안 필터를 추가하는 순간이 오류가 표시됩니다. 나는 이것을 성공적으로 해결하려고 미친 듯이 노력했다.

이것은 내 WebSecurityConfigurerAdapter입니다.

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("tom").password("123456").roles("USER");
        auth.inMemoryAuthentication().withUser("bill").password("123456").roles("ADMIN");
        auth.inMemoryAuthentication().withUser("james").password("123456").roles("SUPERADMIN");
    }

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

        http.authorizeRequests()
                .antMatchers("/signin").access("hasRole('ROLE_ADMIN')")
                .and().formLogin();

    }
}

WebConfig

@Configuration
@EnableWebMvc
@ComponentScan(value = {"com.hp.visitor.controller"})
@Import({ WebSecurityConfig.class })
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    UrlBasedViewResolver setupViewResolver(){
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }

}

나는 많은 노력을했지만 항상 503 오류를 보여줍니다.

어떻게 해결할 수 있습니까?

해결법

  1. ==============================

    1.이 방법으로 보안 필터를 등록 해보십시오.

    이 방법으로 보안 필터를 등록 해보십시오.

    FilterRegistration.Dynamic securityFilter = servletContext.addFilter("springSecurityFilterChain", DelegatingFilterProxy.class);
        securityFilter.addMappingForUrlPatterns(null, false, "/*");
    

    귀하의 경우에 WebInitializer의 rootContext가 App.java에 있음을 선언하는 구성 클래스에 @Import ({WebSecurityConfig.class})를 추가하십시오

  2. ==============================

    2.AbstractSecurityWebApplicationInitializer에서 확장되는 클래스를 만들면 보안 필터 체인을 자동으로 만들고 초기화합니다. 코드 필요 없음 :

    AbstractSecurityWebApplicationInitializer에서 확장되는 클래스를 만들면 보안 필터 체인을 자동으로 만들고 초기화합니다. 코드 필요 없음 :

    public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {}
    

    또한 단일 디스패처 서블릿 만 작성하는 경우 AbstractAnnotationConfigDispatcherServletInitializer에서 WebAppIntializer 클래스를 확장하는 것을 고려할 수 있습니다.

    public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[]{WebSecurityConfig.class, App.class};
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{WebConfig.class};
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[]{
                "/"
            };
        }
    
  3. ==============================

    3.실제로 보안 필터를 수동으로 추가 할 필요는 없습니다. AbstractSecurityWebApplicationInitializer를 확장하면 필터를 삽입 할 수 있습니다. 아래 예제의 코드보다 코드를 추가 할 필요가 없습니다.

    실제로 보안 필터를 수동으로 추가 할 필요는 없습니다. AbstractSecurityWebApplicationInitializer를 확장하면 필터를 삽입 할 수 있습니다. 아래 예제의 코드보다 코드를 추가 할 필요가 없습니다.

    package com.example.spring.security.config;
    
    import org.springframework.core.annotation.Order;
    import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
    
    @Order(1)
    public class SecurityWebAppInitializer extends AbstractSecurityWebApplicationInitializer {
    
    }
    

    일반적으로 @Order (1)로 보안 앱 초기화 프로그램을, @Order (2)에 표준 웹 앱 초기화 프로그램을 제공합니다.

    또한 구성 요소 검사가 올바르게 설정되어 있는지 확인해야합니다. 잘못된 패키지를 가리키며이 오류가 발생했습니다.

  4. from https://stackoverflow.com/questions/23572516/no-bean-named-springsecurityfilterchain-is-defined-error-with-javaconfig by cc-by-sa and MIT license