28198


Spring SecurityでCSRF対策機能だけ使うには、どのような記述をxmlファイルに追加すればいいのでしょうか？

現在、Spring MVC
4.3.2を用いてWebアプリケーションを作成しています。ユーザー登録・ログイン・ログアウト機能などを、自前で実装し終わったところで、ユーザー登録・ログインフォームにCSRF対策を施したいと考えました。これも自前で実装しても良いのですが、Spring
SecurityにCSRF対策を自動で行ってくれる機能があるようなので、それを使うことにしました。Spring
Securityの最新版をMavenの依存性に追加し、Web上の情報にしたがって以下の設定をSpringのxmlファイルに追記しました。

[code]

    <security:http auto-config="true"/>
    
[/code]

この状態でアプリケーションを起動したところ、以下のエラーメッセージが表示されました。

[code]

    org.springframework.beans.factory.NoSuchBeanDefinitionException:
        No bean named 'org.springframework.security.authenticationManager' is defined:
        Did you forget to add a global <authentication-manager> element to your configuration (with child <authentication-provider> elements)?
        Alternatively you can use the authentication-manager-ref attribute on your <http> and <global-method-security> elements.
    
[/code]

そこで、xmlファイルの追加記述を以下のように変更しました。

[code]

    <security:http auto-config="true"/>
    <security:authentication-manager/>
    
[/code]

この変更でエラーは出ないようになったのですが、CSRFトークンがHTMLに挿入されておらず、困っています。ちなみに、web.xmlの方にはDelegatingFilterProxyを追加済みです。

[code]

    <filter>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    
[/code]

ご回答よろしくお願いします。


CC BY-SA 3.0
2016-08-11T11:47:55.700
28196
2016-08-11T12:41:43.403
18450
question
java spring
Spring SecurityによるCSRF対策の実現方法


自己解決しました。

まず、web.xmlに書く`DelegatingFilterProxy`ですが、質問文に記載してあるものは私が`spring-
session`を使うために設定したものでした。てっきり`filter-class`が同じなので追加する必要はないと思っていたのですが、`filter-
name`によって識別されるようで、Spring Security用に`springSecurityFilterChain`という`filter-
name`でfilterを作成する必要があるようです。

[code]

    <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>
    
[/code]

この状態で、Spring
Security自体は動くようになったと言えます。しかしながら、bean定義のxmlのほうがこれだとまだ不十分で、今のままだと、どのページにアクセスしようとしてもログインを促されてしまいます（表示されるページはSpring
Securityによって用意されたものと思われます）。そこで、`http`要素を以下のように書き換えます。

[code]

    <security:http>
        <security:form-login login-page="/login" login-processing-url="login"/>
    </security:http>
    
[/code]

ここで、`login-page`はログインするページのURL、`login-processing-url`はログインフォームのsubmit先です。

最後に、[公式ドキュメント](http://docs.spring.io/spring-
security/site/docs/current/reference/html/csrf.html)には

> If you are using Spring MVC tag or Thymeleaf 2.1+ and are using
> @EnableWebSecurity, the CsrfToken is automatically included for you (using
> the CsrfRequestDataValueProcessor).

と書いてありますが、自動で`input`タグが作られるわけではなく、自分でCSRFトークンを入れる`input`タグを作ってやらなければならないようです（使用していたのはThymeleaf
2.1.5）。

[code]

    <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
    
[/code]


CC BY-SA 3.0
2016-08-11T12:41:43.403
28198
2016-08-11T12:41:43.403
18450
28196
answer