カスタムJDBCレルムでApacheShiroを使用して、ユーザーのソルト、パスワード、ハッシュアルゴリズム名、およびハッシュ反復回数をデータベースから取得しています。これらはすべて個別の列として格納されています。
問題は、PasswordMatcherを使用してユーザーのパスワードがデータベースに保存されているものと一致することを確認するときに、データベースから取得したソルトをどのように処理する必要があるかわからないことです。
HashedCredentialsMatcherを使用する場合、ソルトはsetCredentialsSalt
メソッドを使用して設定されますが、HashedCredentialsMatcherの代わりにPasswordMatcherを使用する場合はそうではないようです。
カスタムJDBCレルムで使用しているコードは次のとおりです
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//code to retrieve user details from database removed for brevity
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, passwdSalt.password, getName());
info.setCredentialsSalt(new SimpleByteSource(passwdSalt.salt));
DefaultPasswordService passwordService = new DefaultPasswordService();
DefaultHashService hashService = new DefaultHashService();
PasswordMatcher passwordMatcher = new PasswordMatcher();
hashService.setHashAlgorithmName(passwdSalt.hashAlgorithmName);
hashService.setHashIterations(passwdSalt.hashIterations);
passwordService.setHashService(hashService);
passwordMatcher.setPasswordService(passwordService);
setCredentialsMatcher(passwordMatcher);
return info;
}
コードをステップスルーした結果、データベース内のハッシュされたパスワードと照合するためにユーザーが入力したパスワードをハッシュするときにソルトが使用されていないことが問題の原因であることを確認しました。DefaultPasswordService.javaで、メソッドpasswordsMatch(Object submitdPlaintext、String saved)が160行目で呼び出されると、指定されたオブジェクトrequest
には次のものが含まれます。
algorithmName=null
iterations=0
salt=null
source=cGFzc3dvcmQ=
161行目のコードの次の行はcomputeHash(request)
DefaultHashService.javaで、メソッドcomputeHash(HashRequest request)
が呼び出されたとき、155行目と157行目で、変数algorithmNameとiterationsがそれぞれに正しく設定されSHA-256
て1
います。159行目でメソッドgetPublicSalt(request)
が呼び出されましたが、nullに戻ります。
他の誰かがShiroのPasswordMatcherをカスタムレルムで使用したことがありますか?Shiroにソルトを使用するようにどのように指示しますか?