クラス 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 の場合:
    1. 最初のパスワードは、PasswordEncoder ID が "bcrypt"、encodedPassword が "$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG" です。一致すると、BCryptPasswordEncoder に委譲されます。
    2. 2 番目のパスワードは、PasswordEncoder ID が "noop"、encodedPassword が "password" になります。一致すると、NoOpPasswordEncoder に委譲されます。
    3. 3 番目のパスワードは、PasswordEncoder ID が "pbkdf2"、encodedPassword が "5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc" になります。一致すると、Pbkdf2PasswordEncoder に委譲されます。
    4. 4 番目のパスワードは、PasswordEncoder ID が "scrypt"、encodedPassword が「$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=" となり、一致すると SCryptPasswordEncoder に委譲されます。
    5. 最終的なパスワードは、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.Stringencode​(java.lang.CharSequence rawPassword)
      生のパスワードをエンコードします。
      booleanmatches​(java.lang.CharSequence rawPassword, java.lang.String prefixEncodedPassword)
      ストレージから取得したエンコードされたパスワードが、エンコードされた後に送信された生のパスワードと一致することを確認します。
      voidsetDefaultPasswordEncoderForMatches​(PasswordEncoder defaultPasswordEncoderForMatches)
      ID が PasswordEncoder にマップされていない場合、matches(CharSequence, String) の委譲先として PasswordEncoder を設定します。
      booleanupgradeEncoding​(java.lang.String prefixEncodedPassword)
      セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true を返し、そうでない場合は false を返します。
      • クラス java.lang.Object から継承されたメソッド

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • コンストラクターの詳細

      • 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 を検索するために使用される ID
        idToPasswordEncoder - どの 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 以上のハッシュを適用します。
        次で指定:
        インターフェース PasswordEncoderencode 
      • matches

        public boolean matches​(java.lang.CharSequence rawPassword,
                               java.lang.String prefixEncodedPassword)
        インターフェースからコピーされた説明: PasswordEncoder
        ストレージから取得したエンコードされたパスワードが、エンコードされた後に送信された生のパスワードと一致することを確認します。パスワードが一致する場合は true を返し、一致しない場合は false を返します。保管されたパスワード自体は決してデコードされません。
        次で指定:
        インターフェース PasswordEncodermatches 
        パラメーター:
        rawPassword - エンコードおよび照合する生のパスワード
        prefixEncodedPassword - 比較するストレージからのエンコードされたパスワード
        戻り値:
        エンコード後の生のパスワードがストレージからのエンコードされたパスワードと一致する場合は true
      • upgradeEncoding

        public boolean upgradeEncoding​(java.lang.String prefixEncodedPassword)
        インターフェースからコピーされた説明: PasswordEncoder
        セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true を返し、そうでない場合は false を返します。デフォルトの実装は常に false を返します。
        次で指定:
        インターフェース PasswordEncoderupgradeEncoding 
        パラメーター:
        prefixEncodedPassword - チェックするエンコードされたパスワード
        戻り値:
        セキュリティを強化するためにエンコードされたパスワードを再度エンコードする必要がある場合は true、そうでない場合は false。