获取错误org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为'springSecurityFilterChain'的bean

Jåc*_*cob 34 java spring login spring-security

我使用Spring Security运行NTLM,我收到以下错误

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为'springSecurityFilterChain'的bean

我该如何解决这个错误?

我在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>
Run Code Online (Sandbox Code Playgroud)

更新1

我解决了这个错误,现在我得到了

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为'filterSecurityInterceptor'的bean

我有以下内容

<bean id="springSecurityFilterChain" class="org.acegisecurity.util.FilterChainProxy">
    <property name="filterInvocationDefinitionSource">
    <value>
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    PATTERN_TYPE_APACHE_ANT
    /**=httpSessionContextIntegrationFilter, exceptionTranslationFilter, ntlmFilter, filterSecurityInterceptor
    </value>
    </property>
    </bean>`
Run Code Online (Sandbox Code Playgroud)

我改变了我的applicationContext.xml如下所示,因为就像@Sean Patrick Floyd所提到的那样,一些元素已经老了,已经死了并埋葬了.但是我现在有其他错误需要修复:-)

谢谢

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.2.xsd">
  <!--<authentication-manager alias="_authenticationManager"></authentication-manager>-->
  <security:authentication-provider>
    <security:user-service>
      <security:user name="testuser" password="PASSWORD" authorities="ROLE_USER, ROLE_ADMIN"/>
      <security:user name="administrator" password="PASSWORD" authorities="ROLE_USER,ROLE_ADMIN"/>
    </security:user-service>
  </security:authentication-provider>
  <bean id="userDetailsAuthenticationProvider"
        class="com.icesoft.icefaces.security.UserDetailsAuthenticationProvider">
    <security:custom-authentication-provider/>
  </bean>
  <bean id="ntlmEntryPoint"
        class="org.springframework.security.ui.ntlm.NtlmProcessingFilterEntryPoint">
    <property name="authenticationFailureUrl" value="/accessDenied.jspx"/>
  </bean>
  <bean id="ntlmFilter" class="org.springframework.security.ui.ntlm.NtlmProcessingFilter">
    <security:custom-filter position="NTLM_FILTER"/>
    <property name="stripDomain" value="true"/>
    <property name="defaultDomain" value="domain"/>
    <property name="netbiosWINS" value="domain"/>
    <property name="authenticationManager" ref="_authenticationManager"/>
  </bean>
  <bean id="exceptionTranslationFilter"
        class="org.springframework.security.ui.ExceptionTranslationFilter">
    <property name="authenticationEntryPoint" ref="ntlmEntryPoint"/>
  </bean>
  <security:http access-decision-manager-ref="accessDecisionManager"
                 entry-point-ref="ntlmEntryPoint">
    <security:intercept-url pattern="/accessDenied.jspx" filters="none"/>
    <security:intercept-url pattern="/**" access="ROLE_USER"/>
  </security:http>
  <bean id="accessDecisionManager" class="org.springframework.security.vote.UnanimousBased">
    <property name="allowIfAllAbstainDecisions" value="false"/>
    <property name="decisionVoters">
      <list>
        <bean id="roleVoter" class="org.springframework.security.vote.RoleVoter"/>
      </list>
    </property>
  </bean>
</beans>
Run Code Online (Sandbox Code Playgroud)

Sea*_*oyd 41

来自DelegatingFilterProxy文档:

请注意,过滤器实际上是DelegatingFilterProxy,而不是实际实现过滤器逻辑的类.DelegatingFilterProxy所做的是将Filter的方法委托给从Spring应用程序上下文中获取的bean.这使bean能够受益于Spring Web应用程序上下文生命周期支持和配置灵活性.bean必须实现javax.servlet.Filter,它必须与filter-name元素中的名称相同.有关更多信息,请阅读DelegatingFilterProxy的Javadoc

您需要定义一个名为在您的应用程序上下文springSecurityFilterChain中实现的bean javax.servlet.Filter.

安全命名空间配置入门:

如果您熟悉框架的命名空前版本,您可能已经大致猜测了这里发生了什么.<http>元素负责创建 FilterChainProxy它使用的过滤器bean.由于过滤器位置是预定义的,因此不正确的过滤器排序等常见问题不再是问题.

所以你至少需要一个最小<http>配置

  • @Ritesh你误读了文档.仅当您使用mvc名称空间中的`<http>`标记时,才会自动创建它 (3认同)
  • 看这里.http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-getting-started.springSecurityFilterChain是一个由Spring Security自动提供的内部基础结构bean. (2认同)

Chr*_*son 6

肖恩帕特里克弗洛伊德是绝对正确的,但我认为值得一提的是一个解决方案,这对我来说花了很多时间.

您只需添加@ImportResource注释即可.

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"org.company"})
@ImportResource({"classpath:security.xml"})
public class CompanyWebMvcConfiguration extends WebMvcConfigurerAdapter {
}
Run Code Online (Sandbox Code Playgroud)

security.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.1.xsd">


    <http use-expressions="true">
        <access-denied-handler error-page="/error"/>
    </http>
Run Code Online (Sandbox Code Playgroud)