クラス DelegatingPasswordEncoder
- java.lang.Object
-
- org.springframework.security.crypto.password.DelegatingPasswordEncoder
- 実装されたすべてのインターフェース:
PasswordEncoder
public class DelegatingPasswordEncoder extends java.lang.Object implements 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
になります。この動作はsetDefaultPasswordEncoderForMatches(PasswordEncoder)
を使用してカスタマイズできます。- 導入:
- 5.0
- 関連事項:
PasswordEncoderFactories
コンストラクターのサマリー
コンストラクター コンストラクター 説明 DelegatingPasswordEncoder(java.lang.String idForEncode, java.util.Map<java.lang.String,PasswordEncoder> idToPasswordEncoder)
新しいインスタンスを作成しますDelegatingPasswordEncoder(java.lang.String idForEncode, java.util.Map<java.lang.String,PasswordEncoder> idToPasswordEncoder, java.lang.String idPrefix, java.lang.String idSuffix)
新しいインスタンスを作成します
メソッドのサマリー
すべてのメソッド インスタンスメソッド 具象メソッド 修飾子と型 メソッド 説明 java.lang.String
encode(java.lang.CharSequence rawPassword)
生のパスワードをエンコードします。boolean
matches(java.lang.CharSequence rawPassword, java.lang.String prefixEncodedPassword)
ストレージから取得したエンコードされたパスワードが、エンコードされた後に送信された生のパスワードと一致することを確認します。void
setDefaultPasswordEncoderForMatches(PasswordEncoder defaultPasswordEncoderForMatches)
boolean
upgradeEncoding(java.lang.String prefixEncodedPassword)
セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true を返し、そうでない場合は false を返します。
コンストラクターの詳細
DelegatingPasswordEncoder
public DelegatingPasswordEncoder(java.lang.String idForEncode, java.util.Map<java.lang.String,PasswordEncoder> idToPasswordEncoder)
新しいインスタンスを作成します- パラメーター:
idForEncode
-encode(CharSequence)
に使用するPasswordEncoder
を検索するために使用される IDidToPasswordEncoder
-matches(CharSequence, String)
に使用するPasswordEncoder
を決定するために使用されるPasswordEncoder
への ID のマップ
DelegatingPasswordEncoder
public DelegatingPasswordEncoder(java.lang.String idForEncode, java.util.Map<java.lang.String,PasswordEncoder> idToPasswordEncoder, java.lang.String idPrefix, java.lang.String idSuffix)
新しいインスタンスを作成します- パラメーター:
idForEncode
-encode(CharSequence)
に使用するPasswordEncoder
を検索するために使用される IDidToPasswordEncoder
- どのPasswordEncoder
を使用するかを決定するために使用される ID からPasswordEncoder
へのマップidPrefix
- エンコードされた結果で ID の開始を示すプレフィックスidSuffix
- エンコードされた結果の ID の終わりを示すサフィックスmatches(CharSequence, String)
メソッドの詳細
setDefaultPasswordEncoderForMatches
public void setDefaultPasswordEncoderForMatches(PasswordEncoder defaultPasswordEncoderForMatches)
ID がPasswordEncoder
にマップされていない場合、matches(CharSequence, String)
の委譲先としてPasswordEncoder
を設定します。提供される encodedPassword は、{"id" } 部分を含む渡される完全なパスワードになります。* 例: "{notmapped}foobar" のパスワードが使用された場合、"id" は "notmapped" になり、
PasswordEncoder
に渡される encodedPassword は "{notmapped}foobar" になります。- パラメーター:
defaultPasswordEncoderForMatches
- 使用するエンコーダ。デフォルトではIllegalArgumentException
をスローします
encode
public java.lang.String encode(java.lang.CharSequence rawPassword)
インターフェースからコピーされた説明:PasswordEncoder
生のパスワードをエンコードします。一般に、適切なエンコードアルゴリズムは、8 バイト以上のランダムに生成されたソルトと組み合わせた SHA-1 以上のハッシュを適用します。- 次で指定:
- インターフェース
PasswordEncoder
のencode
matches
public boolean matches(java.lang.CharSequence rawPassword, java.lang.String prefixEncodedPassword)
インターフェースからコピーされた説明:PasswordEncoder
ストレージから取得したエンコードされたパスワードが、エンコードされた後に送信された生のパスワードと一致することを確認します。パスワードが一致する場合は true を返し、一致しない場合は false を返します。保管されたパスワード自体は決してデコードされません。- 次で指定:
- インターフェース
PasswordEncoder
のmatches
- パラメーター:
rawPassword
- エンコードおよび照合する生のパスワードprefixEncodedPassword
- 比較するストレージからのエンコードされたパスワード- 戻り値:
- エンコード後の生のパスワードがストレージからのエンコードされたパスワードと一致する場合は true
upgradeEncoding
public boolean upgradeEncoding(java.lang.String prefixEncodedPassword)
インターフェースからコピーされた説明:PasswordEncoder
セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true を返し、そうでない場合は false を返します。デフォルトの実装は常に false を返します。- 次で指定:
- インターフェース
PasswordEncoder
のupgradeEncoding
- パラメーター:
prefixEncodedPassword
- チェックするエンコードされたパスワード- 戻り値:
- セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true、そうでない場合は false。