1. 問題

この記事では、Spring Securityの構成の問題、つまりアプリケーションのブートストラッププロセスが次の例外をスローすることについて説明します。

SEVERE: Exception starting filter springSecurityFilterChain
org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No bean named 'springSecurityFilterChain' is defined

2. 原因

この例外の原因は単純です。SpringSecurityはspringSecurityFilterChain(デフォルト)という名前のBeanを探しますが、見つけることができません。 このBeanは、web.xmlで定義されているメインのSpringSecurity Filter DelegatingFilterProxy –で必要です。

<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>

これは、すべてのロジックをspringSecurityFilterChainBeanに委任する単なるプロキシです。

3. ソリューション

このBeanがコンテキストから欠落している最も一般的な理由は、セキュリティXML構成に番号エレメント定義:

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

</beans:beans>

XML構成がセキュリティ名前空間を使用している場合–上記の例のように、宣言するシンプルなエレメントフィルタBeanが作成され、すべてが正しく起動することを確認します。

<http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>

もう1つの考えられる理由は、セキュリティ構成がWebアプリケーションの全体的なコンテキストにまったくインポートされていないことです。

セキュリティXML構成ファイルの名前がspringSecurityConfig.xmlの場合は、リソースがインポートされていることを確認してください

@ImportResource({"classpath:springSecurityConfig.xml"})

またはXMLの場合:

<import resource="classpath:springSecurityConfig.xml" />

最後に、フィルターBeanのデフォルト名は、 web.xml で変更できます。通常は、SpringSecurityで既存のフィルターを使用します。

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>
      org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>customFilter</param-value>
    </init-param>
</filter>

4. 結論

この記事では、非常に具体的なSpring Securityの問題(フィルターチェーンBeanの欠落)について説明し、この一般的な問題の解決策を示します。