[TIL]PasswordEncoder整合関数


Spring Securityを使用する場合、パスワードを符号化するため、PasswordEncdoerクラスを使用します.
また、パーソナル化された認証ロジックを実現するために、AuthenticationManagerおよびAbstractAuthenticationProcessingFilterを継承して素子を実現する.
この場合はパスワードの論理を検証する必要があり、データベースに格納されているパスワードはPasswordEncoder符号化された文字列であり、Httpパラメータに渡されたデータは元の文字列であり、それをPasswordEncdoerと符号化し、データベースに格納されている値と比較すると、不一致の問題が発生する.
  • ソース文字列:1234
  • DBに格納されているハッシュ元文字列:$2a$10$j799cCVx1SUMl1WeAK72PufMWGgW2RyxAkYOq/wB75tx7c50GgCMa
  • encode(password);符号化文字列:$2a$10$aHNgzU.kISAnHEGpznVA..9iPi6PogpQl8k0UfymVg3f/2qfgw4c.
  • このように,encode法により文字列を符号化するたびに,結果は常に変化する.したがって,単純に文字列を比較する方法である+457914和を用いると,論理は自分の意思では働かない.
    この場合、利用可能な方法は、equls()クラスで提供されているPasswordEncoder
    public boolean isMatches(String inDBPwd, String inputPwd){
    	boolean b = inDBPwd.equals(passwordEncoder.encode(inputPwd);
     	System.out.println(b);    	// true
    	boolean b = passwordEncoder.matches(inDBpwd, inputPwd); 
    	System.out.println(b);    	// false
    }
    上記のコードから、データベースに格納されているハッシュ文字列と比較される文字列は、ハッシュ処理後に比較されるのではなく、ハッシュ処理前に元の文字列をパラメータとしてデータベースに格納する事実がわかる.