クラス DelegatingPasswordEncoder
java.lang.ObjectSE
org.springframework.security.crypto.password.DelegatingPasswordEncoder
- 実装されたすべてのインターフェース:
PasswordEncoder
接頭辞付き識別子に基づいて別の PasswordEncoder に委譲するパスワードエンコーダー。
インスタンスの作成
PasswordEncoderFactories
を使用してインスタンスを簡単に構築できます。または、独自のカスタムインスタンスを作成することもできます。例:String idForEncode = "bcrypt"; Map<String,PasswordEncoder> encoders = new HashMap<>(); encoders.put(idForEncode, new BCryptPasswordEncoder()); encoders.put("noop", NoOpPasswordEncoder.getInstance()); encoders.put("pbkdf2", new Pbkdf2PasswordEncoder()); encoders.put("scrypt", new SCryptPasswordEncoder()); encoders.put("sha256", new StandardPasswordEncoder()); PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);
パスワード保存形式
パスワードの一般的な形式は次のとおりです。{id}encodedPasswordここで、"id" はどの
PasswordEncoder
を使用するかを検索するために使用される識別子であり、"encodedPassword" は選択された PasswordEncoder
の元のエンコードされたパスワードです。"id" はパスワードの先頭にあり、"{" (id プレフィックス)で始まり、"}" (id サフィックス)で終わる必要があります。id プレフィックスと id サフィックスは両方とも DelegatingPasswordEncoder(String, Map, String, String)
を介してカスタマイズできます。"id" が見つからない場合、"id" は null になります。例: 以下は、異なる "id" を使用してエンコードされたパスワードのリストです。元のパスワードはすべて "password" です。{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG {noop}password {pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc {scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc= {sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0上記で作成した DelegatingPasswordEncoder の場合:
- 最初のパスワードは、
PasswordEncoder
ID が "bcrypt"、encodedPassword が "$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG" です。一致すると、BCryptPasswordEncoder
に委譲されます。 - 2 番目のパスワードは、
PasswordEncoder
ID が "noop"、encodedPassword が "password" になります。一致すると、NoOpPasswordEncoder
に委譲されます。 - 3 番目のパスワードは、
PasswordEncoder
ID が "pbkdf2"、encodedPassword が "5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc" になります。一致すると、Pbkdf2PasswordEncoder
に委譲されます。 - 4 番目のパスワードは、
PasswordEncoder
ID が "scrypt"、encodedPassword が「$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=" となり、一致するとSCryptPasswordEncoder
に委譲されます。 - 最終的なパスワードは、
PasswordEncoder
ID が "sha256"、encodedPassword が "97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0" になります。一致すると、StandardPasswordEncoder
に委譲されます。
パスワードエンコーディング
コンストラクターに渡されるidForEncode
は、パスワードのエンコードに使用される PasswordEncoder
を決定します。上記で作成した DelegatingPasswordEncoder
では、"password" をエンコードした結果が BCryptPasswordEncoder
に委譲され、接頭辞 "{bcrypt}" が付けられます。最終結果は次のようになります。{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
パスワード照合
照合は、"id" と、コンストラクターで提供されるPasswordEncoder
への "id" のマッピングに基づいて行われます。「パスワードの保存形式」の例は、これがどのように行われるかの実例を提供します。デフォルトでは、マップされていない "id" (null id を含む) を持つパスワードで matches(CharSequence, String)
を呼び出した結果は、IllegalArgumentException
SE になります。この動作は setDefaultPasswordEncoderForMatches(PasswordEncoder)
を使用してカスタマイズできます。- 導入:
- 5.0
- 関連事項:
コンストラクターの概要
コンストラクターコンストラクター説明DelegatingPasswordEncoder
(StringSE idForEncode, MapSE<StringSE, PasswordEncoder> idToPasswordEncoder) 新しいインスタンスを作成しますDelegatingPasswordEncoder
(StringSE idForEncode, MapSE<StringSE, PasswordEncoder> idToPasswordEncoder, StringSE idPrefix, StringSE idSuffix) 新しいインスタンスを作成しますメソッドのサマリー
修飾子と型メソッド説明encode
(CharSequenceSE rawPassword) 生のパスワードをエンコードします。boolean
matches
(CharSequenceSE rawPassword, StringSE prefixEncodedPassword) ストレージから取得したエンコードされたパスワードが、エンコードされた後に送信された生のパスワードと一致することを確認します。void
setDefaultPasswordEncoderForMatches
(PasswordEncoder defaultPasswordEncoderForMatches) boolean
upgradeEncoding
(StringSE prefixEncodedPassword) セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true を返し、そうでない場合は false を返します。
コンストラクターの詳細
DelegatingPasswordEncoder
public DelegatingPasswordEncoder(StringSE idForEncode, MapSE<StringSE, PasswordEncoder> idToPasswordEncoder) 新しいインスタンスを作成します- パラメーター:
idForEncode
-encode(CharSequence)
に使用するPasswordEncoder
を検索するために使用される IDidToPasswordEncoder
-matches(CharSequence, String)
に使用するPasswordEncoder
を決定するために使用されるPasswordEncoder
への ID のマップ
DelegatingPasswordEncoder
public DelegatingPasswordEncoder(StringSE idForEncode, MapSE<StringSE, PasswordEncoder> idToPasswordEncoder, StringSE idPrefix, StringSE idSuffix) 新しいインスタンスを作成します- パラメーター:
idForEncode
-encode(CharSequence)
に使用するPasswordEncoder
を検索するために使用される IDidToPasswordEncoder
- どのPasswordEncoder
を使用するかを決定するために使用される ID からPasswordEncoder
へのマップidPrefix
- エンコードされた結果で ID の開始を示すプレフィックスidSuffix
- エンコードされた結果の ID の終わりを示すサフィックスmatches(CharSequence, String)
メソッドの詳細
setDefaultPasswordEncoderForMatches
ID がPasswordEncoder
にマップされていない場合、matches(CharSequence, String)
の委譲先としてPasswordEncoder
を設定します。提供される encodedPassword は、{"id" } 部分を含む渡される完全なパスワードになります。* 例: "{notmapped}foobar" のパスワードが使用された場合、"id" は "notmapped" になり、
PasswordEncoder
に渡される encodedPassword は "{notmapped}foobar" になります。- パラメーター:
defaultPasswordEncoderForMatches
- 使用するエンコーダ。デフォルトでは、IllegalArgumentException
SE をスローします。
encode
インターフェースからコピーされた説明:PasswordEncoder
生のパスワードをエンコードします。一般に、適切なエンコードアルゴリズムは、8 バイト以上のランダムに生成されたソルトと組み合わせた SHA-1 以上のハッシュを適用します。- 次で指定:
- インターフェース
PasswordEncoder
のencode
matches
インターフェースからコピーされた説明:PasswordEncoder
ストレージから取得したエンコードされたパスワードが、エンコードされた後に送信された生のパスワードと一致することを確認します。パスワードが一致する場合は true を返し、一致しない場合は false を返します。保管されたパスワード自体は決してデコードされません。- 次で指定:
- インターフェース
PasswordEncoder
のmatches
- パラメーター:
rawPassword
- エンコードおよび照合する生のパスワードprefixEncodedPassword
- 比較するストレージからのエンコードされたパスワード- 戻り値:
- エンコード後の生のパスワードがストレージからのエンコードされたパスワードと一致する場合は true
upgradeEncoding
インターフェースからコピーされた説明:PasswordEncoder
セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true を返し、そうでない場合は false を返します。デフォルトの実装は常に false を返します。- 次で指定:
- インターフェース
PasswordEncoder
のupgradeEncoding
- パラメーター:
prefixEncodedPassword
- チェックするエンコードされたパスワード- 戻り値:
- セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true、そうでない場合は false。