安全なログイン コードを修正する必要があります。
@Override
public User login(String username, String password, Boolean rememberMe) {
log.info("Logging in username="+username);
UsernamePasswordToken token;
String hashed = BCrypt.hashpw(password, BCrypt.gensalt());
log.info("Hashed password=" + hashed);
token = new UsernamePasswordToken(username, hashed);
// ”Remember Me” built-in, just do this:
token.setRememberMe(rememberMe);
try {
// With most of Shiro, you'll always want to make sure you're working with the currently executing user,
// referred to as the subject
Subject currentUser = SecurityUtils.getSubject();
// Authenticate
//currentUser.login(token);
User user = userDAO.fetchUserByName(username, hashed);
return user;
} catch (org.apache.shiro.authc.AuthenticationException e) {
throw new AuthenticationException("Failure in authentication");
} catch (IllegalStateException e){
throw new AuthenticationException("Application is in a illegal state");
} catch (Exception e){
throw new AuthenticationException("Some other error during login was caught.");
}
}
DAO レベル:
- ユーザー オブジェクトは、ユーザー名とハッシュ化されたパスワードで取得されます
ただし、現在、DB に保存されているパスワードはプレーンなので、ハッシュ化されたパスワードに置き換えるだけです。ここでの問題は次のとおりです。
- BCrypt.hashpw() メソッドは、このコードをログに記録したときにわかるように、異なるハッシュを生成します。
したがって、問題は、ハッシュ化されたパスワードが毎回変更されるときに、そのパスワードを保存する方法です。
私が考えていたアイデアは、
- ユーザーは UI にプレーン パスワードを入力します。このログイン メソッドでは、パスワードがハッシュされ、ユーザーが fetchUserByName(username, hashed) メソッドを介して取得されます。しかし、この特定の Shiro と BCrypt の組み合わせに対する解決策ではないようです。
これに対処する正しい方法は何ですか?