我在哪里定义`springSecurityFilterChain` bean?

当我将springSecurityFilterChain的bean定义放在web.xml ,我收到一个错误,指示Tomcat 7无法启动,因为duplicate bean definition for springSecurityFilterChain有一个duplicate bean definition for springSecurityFilterChain 。 我将整个堆栈跟踪上传到文件共享站点,您可以通过单击此链接阅读该站点。 但是,当我在web.xml springSecurityFilterChain bean定义并尝试重新启动服务器时,我得到一条不同的错误消息,指出springSecurityFilterChain没有bean定义。 您可以通过单击此链接来读取文件共享站点上的第二个堆栈跟踪。

那么我应该把springSecurityFilterChain的bean定义放在springSecurityFilterChain ,它的语法应该是什么?

我认为问题可能是我用来测试这种方法的spring petclinic示例应用程序有自己的方式使用clinicservice和自己的xml配置文件来处理应用程序启动和资源管理。 您可以在此链接中查看spring petclinic应用程序的完整代码。

我对petclinic应用程序所做的更改如下:

我在pom.xml中添加了以下内容:

  org.springframework.security spring-security-core 3.2.2.RELEASE   org.springframework.security spring-security-web 3.2.2.RELEASE   org.springframework.security spring-security-config 3.2.2.RELEASE  

我在web.xml中添加了以下内容:

  springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /*  

我在Java Resourcessrc/main/java添加了一个名为org.springframework.security.samples.knowledgemanager.config的包,然后我向它添加了以下两个类:

MessageSecurityWebApplicationInitializer.java:

 @Order(2) public class MessageSecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {} 

SecurityConfig.java:

 @Configuration @EnableWebMvcSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private DataSource dataSource; @Autowired private UserDetailsService myCustomUserDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .jdbcAuthentication() .dataSource(dataSource) .and() .userDetailsService(myCustomUserDetailsService); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/app/**").hasRole("ADMIN") .and() .formLogin() .loginPage("/index.jsp") .defaultSuccessUrl("/app/") .failureUrl("/index.jsp") .permitAll() .and() .logout() .logoutSuccessUrl("/index.jsp"); } } 

我收到一个错误,表明Tomcat 7无法启动,因为springSecurityFilterChain有一个重复的bean定义

这是因为您应该使用(不是)web.xml或AbstractSecurityWebApplicationInitializer来定义springSecurityFilterChain。 当您似乎使用Java配置时,我会删除web.xml条目。

但是,当我在web.xml中注释掉springSecurityFilterChain bean定义并尝试重新启动服务器时,我得到一条不同的错误消息,指出springSecurityFilterChain没有bean定义。

这是因为需要以某种方式引用SecurityConfig。 通常,使用Java配置时最简单的方法是将配置传递给MessageSecurityWebApplicationInitializer的超类构造函数。

但是,宠物诊所在web.xml中使用XML配置,因此您需要通过组合参考中概述的Java和XML配置来完成此操作。 对于此示例,您可以在src / main / resources / business-config.xml中包含以下内容

  

当然,您需要将包装替换为您用于SecurityConfig的包装。

您可以在business-config.xml中包含配置的原因是因为它被指定为要在web.xml中加载的contextConfiguration 。 您还可以创建自己的Spring bean XML文件,添加如上所示的SecurityConfig bean,并确保更新web.xml以指向新的Spring bean XML文件。