当前位置: 首页 > 面试题库 >

我在哪里定义`springSecurityFilterChain` bean?

柴飞星
2023-03-14
问题内容

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

那么我应该将bean定义放在哪里springSecurityFilterChain,其语法应该是什么?

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

我对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.configsrc/main/javaJava 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文件。



 类似资料:
  • 我找不到那个方法。

  • 问题内容: 我应该调用哪个头文件才能将PATH_MAX用作用于调整字符串大小的int? 我希望能够声明: 但是当我这样做时,我的编译器(Linux上为Clang / LLVM)发出以下错误: 我试图做一个谷歌搜索,但仍然没有运气。 不能解决问题/错误。 我是否也正确将PATH_MAX的值设置为int? 问题答案: 它在。 如本博客所述存在一些缺陷(感谢paulsm4)

  • 很好的一天, 我有一些自定义代码从以前的非mvc应用程序。这都是单元测试之类的。现在,我需要把它放在laravel应用程序中。它们不是控制器、模型或视图?这是否意味着我必须将它们与Symfony和Swiftmailer文件夹一起放入供应商文件夹?

  • 问题内容: 我在ASP.Net中有一个WebAPI 2.0项目,在其中实现了自定义的DefaultContractResolver,以便可以控制如何使用JSON.Net将实体序列化为JSON。但是我不确定如何告诉框架使用我的自定义实现。我也想知道是否有可能更改特定控制器/动作的ContractResolver。 谢谢! -–编辑03/07/2014我已经通过创建一个新的ConfigSettings

  • 问题内容: 当我调用它时,它会生成,但是有时我希望它生成。我在文档中找不到要指定的位置。我需要做吗? 问题答案: 采用关键字参数,该参数将返回绝对(而非相对)URL。我相信您将需要在根域中设置一个配置密钥,以使其正常工作。

  • Java坚持 注释是在没有特定实现的情况下定义的。 实际验证在哪里实施?如何扩展此功能以允许管理员覆盖? 虽然这里没有显示,但我已经将组用于此约束的另一个目的。