質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

3401閲覧

Spring Securityを用いたCSRF対策の実現方法

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2016/08/11 10:47

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

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

xml

1<security:http auto-config="true"/>

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

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.

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

xml

1<security:http auto-config="true"/> 2<security:authentication-manager/>

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

xml

1<filter> 2 <filter-name>springSessionRepositoryFilter</filter-name> 3 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 4</filter> 5<filter-mapping> 6 <filter-name>springSessionRepositoryFilter</filter-name> 7 <url-pattern>/*</url-pattern> 8 <dispatcher>REQUEST</dispatcher> 9 <dispatcher>ERROR</dispatcher> 10</filter-mapping>

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/11 12:38

コメントありがとうございます。Thymeleafの方にも修正が必要でしたが、それだけではないようでした。自己解決したので、解決した方法を投稿しました。
guest

回答1

0

ベストアンサー

自己解決しました。

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

xml

1<filter> 2 <filter-name>springSecurityFilterChain</filter-name> 3 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 4</filter> 5<filter-mapping> 6 <filter-name>springSecurityFilterChain</filter-name> 7 <url-pattern>/*</url-pattern> 8</filter-mapping>

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

xml

1<security:http> 2 <security:form-login login-page="/login" login-processing-url="login"/> 3</security:http>

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

最後に、公式ドキュメントには

If you are using Spring MVC form:form 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)。

html

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

投稿2016/08/11 12:37

編集2016/08/11 12:39
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問