Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有名为'的bean;springSecurityFilterChain';是用javaconfig定义的错误_Java_Spring_Spring Mvc_Spring Security - Fatal编程技术网

没有名为'的bean;springSecurityFilterChain';是用javaconfig定义的错误

没有名为'的bean;springSecurityFilterChain';是用javaconfig定义的错误,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,我在添加spring安全性时遇到一些问题。它显示的错误是:没有定义名为“springSecurityFilterChain”的bean public class WebInitializer implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) throws ServletException { // Create the 'root'

我在添加spring安全性时遇到一些问题。它显示的错误是:没有定义名为“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);
    }
}
在我添加安全过滤器的那一刻,它显示了这个错误。我一直疯狂地试图解决这个问题,但没有成功

这是我的网站安全配置适配器

@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();

    }
}
网络配置

@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错误


如何修复它?

您只需创建一个从AbstractSecurityWebApplicationInitializer扩展的类,它就会自动为您创建/初始化安全筛选器链。无需代码:

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {}

此外,如果您只创建一个分派器servlet,您可以考虑简单地从ActuaTunNoTeCaseService Servlet初始化器扩展WebAppInTaluIZER类:

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[]{
            "/"
        };
    }
公共类WebAppInitializer扩展了AbstractAnnotationConfigDispatchersServletInitializer{
@凌驾
受保护类[]getRootConfigClasses(){
返回新类[]{WebSecurityConfig.Class,App.Class};
}
@凌驾
受保护类[]getServletConfigClasses(){
返回新类[]{WebConfig.Class};
}
@凌驾
受保护的字符串[]getServletMappings(){
返回新字符串[]{
"/"
};
}

尝试以这种方式注册安全筛选器

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

并添加
@Import({WebSecurityConfig.class})
在配置类中,您在WebInitializer中声明为您的rootContext在您的案例中位于应用程序中。java

您实际上不需要手动添加安全筛选器。您可以扩展
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)
的标准Web应用程序初始值设定项


您还需要确保您的组件扫描正确设置。我已经指向一个错误的包,并且我以前已经得到这个错误。

而不是手动在您的代码中间实例化代理,将它移到Bean方法中。您的<代码> WebSecurityConfig .class < /C> >通过<代码> > @导入<代码> > <代码> WebCo。nfig?是的,我在导入注释中有这个,我在webconfig class@import({WebSecurityConfig.class})中有这个错误。我将把它添加到问题中。我认为
WebSecurityConfig
需要由根上下文而不是调度程序上下文加载。