J'ai besoin de réorganiser un code de connexion sécurisé :
@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.");
}
}
Au niveau de la DAO :
- L'objet utilisateur est récupéré avec le nom d'utilisateur et le mot de passe haché.
Cependant, pour l'instant, le mot de passe stocké dans la base de données est simple, je vais simplement le remplacer par un mot de passe haché. Le problème ici est le suivant :
- La méthode BCrypt.hashpw() génère un hash différent comme je peux le voir lorsque j'ai enregistré ce code.
La question serait donc de savoir comment stocker un mot de passe haché lorsqu'il change à chaque fois.
L'idée à laquelle je pensais est que
- L'utilisateur saisit le mot de passe brut dans l'interface utilisateur, et dans cette méthode de connexion, le mot de passe sera haché puis l'utilisateur sera récupéré par la méthode fetchUserByName(username, hashed) ; mais cela ne semble pas être la solution pour ce mélange particulier de Shiro et BCrypt.
Quelle est la bonne façon d'aborder cette question ?