きっかけ
仕事で、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の情報が出てきたりしていて、どう対処すればいいのかかなり迷った。
参考サイト
Springで定義済のBean名一覧を出力する - endokのブログ
Spring Boot 2.0からSpring Boot 2.2にマイグレーションしたときの変更点 #Java - Qiita