TL;DR
-
SecurityMockServerConfigurers
に定義されたMutator
をWebTestClient
にセットすることで認証を迂回できる- 少なくとも記事にまとめたやり方ではパス・メソッド・Authority周りのチェックは迂回できない(逆に言うと、それらの設定に関してテストを行うことができる)
注意書き
最小構成でのチェックはできておらず、あくまで自分の環境での実装例であることにご注意ください。
また、org.springframework.security:spring-security-test
は導入されている前提で書きます。
サンプルコードはKotlin
で記述しますが、基本的な部分は変わらないはずです。
やること
WebTestClient
を利用したテストを実装する際に、JWT
認証をスキップします。
ここではSecurityMockServerConfigurers.JwtMutator
を設定するやり方を紹介します。
サンプルコードはJWT
ベースで書きますが、SecurityMockServerConfigurers
ドキュメントを見る限りOAuth2
やOIDC
なども同じようなやり方で対応できそうでした。
サンプルコード
サンプルコードは以下の通りです。
注意点として、この書き方では、pathMatchers
で設定するような、パス・メソッド・Authority周りのチェックは迂回できません(逆に言うと、それらの設定に関してテストを行うことができます)。
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.security.core.GrantedAuthority
import org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers
import org.springframework.test.web.reactive.server.WebTestClient
@SpringBootTest
@AutoConfigureWebTestClient
class FooTest @Autowired constructor(
val baseClient: WebTestClient
) {
// Authorityが設定されたWebTestClientを返す関数
private fun WebTestClient.toAuthoritiesAwareClient(vararg authorities: String): WebTestClient {
val mutator: SecurityMockServerConfigurers.JwtMutator = SecurityMockServerConfigurers.mockJwt()
.authorities(authorities.map { GrantedAuthority { it } }) // 権限を設定
return this.mutate()
.apply(mutator)
.build()
}
@Test
fun test() {
val client: WebTestClient = baseClient.toAuthoritiesAwareClient(/* 設定したいAuthorityを記述 */)
// 通常同様にWebTestClientを使ったテストを記述
val result = client.get()...
}
}
呼び出し結果のステータスコードに関する補足
自分の環境では以下のようになりました。
割と当たり前の結果だと思いますが、これによってパス・権限周りのテストを行うことができました。
-
JWT
認証を突破できない ->UNAUTHORIZED
- 権限不足 ->
FORBIDDEN
- どちらもOK ->
API
の実行結果に応じたステータス