【问题标题】:Spring Security Filter showing not found despite being defined in Java config尽管在 Java 配置中定义了 Spring Security Filter,但显示未找到
【发布时间】:2015-04-14 04:39:06
【问题描述】:

我已经使用基于 Java 的配置配置了我的 Spring 应用程序。当我启动我的应用程序时,我收到错误NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined。我已经定义了所有的配置类,但是这个错误仍然发生。我该如何解决这个问题?

我的主要课程:

public class SiteMain implements WebApplicationInitializer {    
    private void initSpringMvcServlet(ServletContext container) {
      AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
      dispatcherContext.register(MvcConfig.class);    
      ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
      dispatcher.setLoadOnStartup(1);
      dispatcher.addMapping("/");
    }

    private void initSpringRootContext(ServletContext container) {
      XmlWebApplicationContext rootContext = new XmlWebApplicationContext();
      rootContext.setConfigLocation("/WEB-INF/site.xml");
      container.addListener(new ContextLoaderListener(rootContext));
    }

    @Override
    public void onStartup(ServletContext container) throws ServletException {
      initSpringRootContext(container);
      initSpringMvcServlet(container);    
    }    
}

我的安全初始化器类是:

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { }

我的 MVC 配置类是:

@Configuration
@EnableWebMvc
@ComponentScan
@Import(SecurityConfig.class)
public class MvcConfig extends WebMvcConfigurerAdapter {

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

我的安全配置类是:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/resources/**").permitAll().anyRequest().authenticated()
      .and().formLogin().loginPage("/").permitAll()
      .and().logout().permitAll()
      .and().rememberMe();
    }
}

【问题讨论】:

  • SecurityWebApplicationInitializer 类中到底有什么?
  • 而site.xml是什么,里面定义了什么?
  • @NikolaB:我的SecurityWebApplicationInitializer 什么都没有。我所给予的就是一切。 site.xml 包含一些 bean 和一个数据库事务管理器。
  • 为什么不创建配置类并将其命名为 BeanConfig 或类似名称,并在 java 配置中定义 bean 和事务管理器,例如:@Bean public MyBean myBean() { return new MyBean(); } 所以你可以删除 site.xml 并且它应该可以工作。
  • 或者您可以删除 initSpringRootContext() 方法并向 MvcConfig 添加注释:@ImportResource({"classpath:/WEB-INF/site.xml"})。根据我之前的修改,它应该可以工作。

标签: spring spring-mvc spring-security


【解决方案1】:

尝试替换这一行:

dispatcherContext.register(MvcConfig.class);    

与:

dispatcherContext.setConfigLocation("your.config.package");

在下面添加一行:

container.addListener(new ContextLoaderListener(dispatcherContext));

不需要@Import(SecurityConfig),因为setConfigLocation 会自动检测所有@Configuration 注释的类。

【讨论】:

  • 根据文档,SecurityWebApplicationInitializer 类负责这一点。此外,我只是基于 Java 的配置,没有 web.xml
  • container.addListener(new ContextLoaderListener(dispatcherContext)); 与container.addListener(new ContextLoaderListener(rootContext)); 冲突,我收到错误java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml! 如果我删除container.addListener(new ContextLoaderListener(rootContext));,那么我在site.xml 中定义的bean 不会被初始化。
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2022-09-27
  • 2012-03-15
相关资源
最近更新 更多