エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

SpringSecurity+keel-spring-boot-starter-web環境の構築

きっかけ

仕事で、SpringBoot+JSPの環境を構築したが、今度はセキュリティ要件が出てきそうだったので、自宅でいろいろ試してみたのでアウトプットする

やりたいこと

SpringSecurityのCSRF対策と二重送信対策を行いたい

対応したソース

GitHub - suzaku-tec/SpringJspSample

対応方法

mavenに下記のdependencyを追加。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
  <groupId>jp.fintan.keel</groupId>
  <artifactId>keel-spring-boot-starter-web</artifactId>
  <version>2.0.0</version>
</dependency>

requestDataValueProcessorのBeanが重複する

requestDataValueProcessorは、spring-boot-starter-securityとkeel-spring-boot-starter-webの両方で登録している。ただ、requestDataValueProcessorは、1つしか登録できないので、何もしないと、起動時にエラーになる。

なので、Delegateクラスを自作し、beanの上書きを可能にしてあげる必要がある。

自分は、CustomCompositeRequestDataValueProcessorクラスを作って、requestDataValueProcessorの実態をリストで管理し、メソッドが呼び出されたときに、リストの全要素に対して同じメソッドを呼ぶようにしている。

実際にそのインスタンスを生成しているのは、WebConfig.javaにて作成している。

また、Beanの上書きは、デフォルト無効なので、有効にしておく。
自分は、application.propertiesでやっているので、下記の設定を追加。

spring.main.allow-bean-definition-overriding=true

beanの上書き可能な設定になるので、場合によっては、設定を上書きしてしまう可能性があるので、要注意。何か問題が起きたら、この件が影響していることも頭の片隅に覚えておく。

また、AutoConfigによる順序の制御を行い、CustomCompositeRequestDataValueProcessorが最後に登録させる。
やり方としては、WebConfigにて、@AutoConfigureAfter(value = {TransactionTokenAutoConfiguration.class, SecurityAutoConfiguration.class})を追加して順序制御している。
requestDataValueProcessorの設定だけ上書きたいので、AutoConfigの除外設定は使わない。

その他苦労して事

requestDataValueProcessorの設定の上書き方法が分からず四苦八苦した。。。
順序の制御に結構悩んだ。順序が悪いのか、AutoConfigの設定がミスっているのかで迷っていた。

最初、CustomCompositeRequestDataValueProcessor作るだけでいいのかと思ったら、requestDataValueProcessorの設定でいろいろ苦戦した。
情報漁ってると、Terasolnaの情報が出てきたりしていて、どう対処すればいいのかかなり迷った。

参考サイト

keel-spring-enhance/keel-spring-web/keel-transaction-token-check/README.md at master · Fintan-contents/keel-spring-enhance · GitHub

Springで定義済のBean名一覧を出力する - endokのブログ

Spring Boot 2.0からSpring Boot 2.2にマイグレーションしたときの変更点 #Java - Qiita

Springで定義済のBean名一覧を出力する - endokのブログ

keel-spring-enhance/keel-spring-web/keel-transaction-token-check/README.md at master · Fintan-contents/keel-spring-enhance · GitHub