当我为springSecurityFilterChainin 放置bean定义时web.xml,出现一条错误消息,指示Tomcat 7因为存在导致无法启动duplicate bean definition for springSecurityFilterChain。我将整个堆栈跟踪上传到了文件共享站点,你可以通过单击此链接来阅读。但是,当我注释掉springSecurityFilterChainbean定义web.xml并尝试重新启动服务器时,我收到一条不同的错误消息,指示没有的bean定义springSecurityFilterChain。你可以通过单击此链接在文件共享站点上阅读第二个堆栈跟踪。
springSecurityFilterChainin
duplicate bean definition for springSecurityFilterChain
springSecurityFilterChainbean
springSecurityFilterChain
那么我应该将bean定义放在哪里springSecurityFilterChain,其语法应该是什么?
我认为问题可能在于,我正在用来测试这种方法的spring petclinic示例应用程序具有使用a clinicservice和自己的xml配置文件来处理应用程序启动和资源管理的自己的方式。你可以在此链接中查看spring petclinic应用程序的完整代码。
clinicservice
我对petclinic应用程序所做的更改如下:
我在pom.xml中添加了以下内容:
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>3.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>3.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>3.2.2.RELEASE</version> </dependency>
我在web.xml中添加了以下内容:
<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
我添加了一个名为包org.springframework.security.samples.knowledgemanager.config来src/main/java的Java Resources,然后我增加了以下两类它:
org.springframework.security.samples.knowledgemanager.config
src/main/java的Java Resources
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中包含以下内容
<bean class="thepackage.SecurityConfig"/>
自然,你将需要用用于SecurityConfig的软件包替换该软件包。
之所以可以将配置包含在business-config.xml中,是因为将其指定为contextConfiguration以便加载到web.xml中。你还可以创建自己的Spring bean XML文件,添加上面所示的SecurityConfig bean,并确保将web.xml更新为指向新的Spring bean XML文件。