最新の安定バージョンについては、Spring Security 6.3.1 を使用してください!

6.0 の準備

Spring Security チームは、Spring Security 6.0 へのアップグレードを簡素化するために 5.8 リリースを準備しました。5.8 と以下の手順を使用して、6.0 に更新する際の変更を最小限に抑えます。

Spring Security 5.8 へのアップデート

最初のステップは、Spring Boot 2.7 の最新のパッチリリースであることを確認することです。次に、Spring Security 5.8 の最新のパッチリリースを使用していることを確認する必要があります。Spring Boot を使用している場合は、Spring Boot バージョンを Spring Security 5.7 から 5.8 にオーバーライドする必要があります。Spring Security 5.8 は Spring Security 5.7 および Spring Boot 2.7 と完全に互換性があります。Spring Security 5.8 への更新方法については、リファレンスガイドの Spring Security の入手セクションを参照してください。

パスワードエンコーディングの更新

6.0 では、PBKDF2、SCrypt、Argon2 のパスワードエンコーディングの最小値が更新されています。

デフォルトのパスワードエンコーダーを使用している場合、従うべき準備手順はなく、このセクションはスキップできます。

Pbkdf2PasswordEncoder の更新

Pbkdf2PasswordEncoder を使用している場合、コンストラクターは、指定された設定が適用される Spring Security バージョンを参照する静的ファクトリに置き換えられます。

非推奨のコンストラクターの使用箇所を置き換える

デフォルトのコンストラクターを使用する場合は、次の変更から始める必要があります。

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
    return new Pbkdf2PasswordEncoder();
}
@Bean
fun passwordEncoder(): PasswordEncoder {
    return Pbkdf2PasswordEncoder()
}

to:

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
    return Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_5();
}
@Bean
fun passwordEncoder(): PasswordEncoder {
    return Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_5()
}

または、カスタム設定がある場合は、次のように、すべての設定を指定するコンストラクターに変更します。

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
    PasswordEncoder current = new Pbkdf2PasswordEncoder("mysecret".getBytes(UTF_8), 320000);
    return current;
}
@Bean
fun passwordEncoder(): PasswordEncoder {
    val current: PasswordEncoder = Pbkdf2PasswordEncoder("mysecret".getBytes(UTF_8), 320000)
    return current
}

次のように、完全に指定されたコンストラクターを使用するように変更します。

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
    PasswordEncoder current = new Pbkdf2PasswordEncoder("mysecret".getBytes(UTF_8), 16, 185000, 256);
    return current;
}
@Bean
fun passwordEncoder(): PasswordEncoder {
    val current: PasswordEncoder = Pbkdf2PasswordEncoder("mysecret".getBytes(UTF_8), 16, 185000, 256)
    return current
}

DelegatingPasswordEncoder を使用する

非推奨のコンストラクターを使用しなくなったら、次のステップは、DelegatingPasswordEncoder を使用してコードを最新の標準にアップグレードする準備をすることです。次のコードは、委譲エンコーダーを構成して、current を使用しているパスワードを検出し、最新のものに置き換えます。

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
    String prefix = "[email protected] (英語)  ";
    PasswordEncoder current = // ... see previous step
    PasswordEncoder upgraded = Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8();
    DelegatingPasswordEncoder delegating = new DelegatingPasswordEncoder(prefix, Map.of(prefix, upgraded));
    delegating.setDefaultPasswordEncoderForMatches(current);
    return delegating;
}
@Bean
fun passwordEncoder(): PasswordEncoder {
    String prefix = "[email protected] (英語)  "
    PasswordEncoder current = // ... see previous step
    PasswordEncoder upgraded = Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8()
    DelegatingPasswordEncoder delegating = new DelegatingPasswordEncoder(prefix, Map.of(prefix, upgraded))
    delegating.setDefaultPasswordEncoderForMatches(current)
    return delegating
}

SCryptPasswordEncoder の更新

SCryptPasswordEncoder を使用している場合、コンストラクターは、指定された設定が適用される Spring Security バージョンを参照する静的ファクトリに置き換えられます。

非推奨のコンストラクターの使用箇所を置き換える

デフォルトのコンストラクターを使用する場合は、次の変更から始める必要があります。

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
    return new SCryptPasswordEncoder();
}
@Bean
fun passwordEncoder(): PasswordEncoder {
    return SCryptPasswordEncoder()
}

to:

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
    return SCryptPasswordEncoder.defaultsForSpringSecurity_v4_1();
}
@Bean
fun passwordEncoder(): PasswordEncoder {
    return SCryptPasswordEncoder.defaultsForSpringSecurity_v4_1()
}

DelegatingPasswordEncoder を使用する

非推奨のコンストラクターを使用しなくなったら、次のステップは、DelegatingPasswordEncoder を使用してコードを最新の標準にアップグレードする準備をすることです。次のコードは、委譲エンコーダーを構成して、current を使用しているパスワードを検出し、最新のものに置き換えます。

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
    String prefix = "[email protected] (英語)  ";
    PasswordEncoder current = // ... see previous step
    PasswordEncoder upgraded = SCryptPasswordEncoder.defaultsForSpringSecurity_v5_8();
    DelegatingPasswordEncoder delegating = new DelegatingPasswordEncoder(prefix, Map.of(prefix, upgraded));
    delegating.setDefaultPasswordEncoderForMatches(current);
    return delegating;
}
@Bean
fun passwordEncoder(): PasswordEncoder {
    String prefix = "[email protected] (英語)  "
    PasswordEncoder current = // ... see previous step
    PasswordEncoder upgraded = SCryptPasswordEncoder.defaultsForSpringSecurity_v5_8()
    DelegatingPasswordEncoder delegating = new DelegatingPasswordEncoder(prefix, Map.of(prefix, upgraded))
    delegating.setDefaultPasswordEncoderForMatches(current)
    return delegating
}

Argon2PasswordEncoder の更新

Argon2PasswordEncoder を使用している場合、コンストラクターは、指定された設定が適用される Spring Security バージョンを参照する静的ファクトリに置き換えられます。

非推奨のコンストラクターの使用箇所を置き換える

デフォルトのコンストラクターを使用する場合は、次の変更から始める必要があります。

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
	return new Argon2PasswordEncoder();
}
@Bean
fun passwordEncoder(): PasswordEncoder {
	return Argon2PasswordEncoder()
}

to:

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
	return Argon2PasswordEncoder.defaultsForSpringSecurity_v5_2();
}
@Bean
fun passwordEncoder(): PasswordEncoder {
	return Argon2PasswordEncoder.defaultsForSpringSecurity_v5_2()
}

DelegatingPasswordEncoder を使用する

非推奨のコンストラクターを使用しなくなったら、次のステップは、DelegatingPasswordEncoder を使用してコードを最新の標準にアップグレードする準備をすることです。次のコードは、委譲エンコーダーを構成して、current を使用しているパスワードを検出し、最新のものに置き換えます。

  • Java

  • Kotlin

@Bean
PasswordEncoder passwordEncoder() {
	String prefix = "[email protected] (英語)  ";
	PasswordEncoder current = // ... see previous step
    PasswordEncoder upgraded = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8();
	DelegatingPasswordEncoder delegating = new DelegatingPasswordEncoder(prefix, Map.of(prefix, upgraded));
	delegating.setDefaultPasswordEncoderForMatches(current);
	return delegating;
}
@Bean
fun passwordEncoder(): PasswordEncoder {
	String prefix = "[email protected] (英語)  "
	PasswordEncoder current = // ... see previous step
    PasswordEncoder upgraded = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8()
	DelegatingPasswordEncoder delegating = new DelegatingPasswordEncoder(prefix, Map.of(prefix, upgraded))
	delegating.setDefaultPasswordEncoderForMatches(current)
	return delegating
}

Encryptors.queryableText の使用をやめる

同じ入力データが同じ出力を生成 (英語) するため、Encryptors.queryableText(CharSequence,CharSequence) は安全ではありません。これは推奨されておらず、6.0 で削除される予定です。Spring Security は、この方法によるデータの暗号化をサポートしなくなりました。

アップグレードするには、サポートされているメカニズムで再暗号化するか、復号化して保存する必要があります。

暗号化された各エントリをテーブルから読み取り、復号化し、サポートされているメカニズムを使用して再暗号化する次の疑似コードを検討してください。

  • Java

TextEncryptor deprecated = Encryptors.queryableText(password, salt);
BytesEncryptor aes = new AesBytesEncryptor(password, salt, KeyGenerators.secureRandom(12), CipherAlgorithm.GCM);
TextEncryptor supported = new HexEncodingTextEncryptor(aes);
for (MyEntry entry : entries) {
	String value = deprecated.decrypt(entry.getEncryptedValue()); (1)
	entry.setEncryptedValue(supported.encrypt(value)); (2)
	entryService.save(entry)
}
1- 上記は非推奨の queryableText を使用して値を平文に変換します。
2- 次に、サポートされている Spring Security メカニズムで値が再暗号化されます。

Spring Security がサポートする暗号化メカニズムの詳細については、リファレンスマニュアルを参照してください。

アプリケーション固有の手順を実行する

次に、サーブレットアプリケーションかリアクティブアプリケーションかによって実行する必要がある手順があります。