我在哪里定义`springSecurityFilterChain` bean?

时间:2014-03-26 18:59:26

标签: java spring spring-mvc spring-security

当我在springSecurityFilterChain中放置web.xml的bean定义时,出现错误,表明Tomcat 7无法启动,因为有duplicate bean definition for springSecurityFilterChain。我将整个堆栈跟踪上传到文件共享站点,您可以阅读by clicking on this link。但是,当我在springSecurityFilterChain中注释掉web.xml bean定义并尝试重新启动服务器时,我收到一条不同的错误消息,指出springSecurityFilterChain没有bean定义。您可以在文件共享站点by clicking on this link读取第二个堆栈跟踪。

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

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

我对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的包,然后我将以下两个类添加到其中:

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");
    }
}

1 个答案:

答案 0 :(得分:10)

  

我收到错误,指示Tomcat 7无法启动,因为springSecurityFilterChain存在重复的bean定义

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

  

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

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

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

中包含以下内容
<bean class="thepackage.SecurityConfig"/>

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

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