2

安全なログイン コードを修正する必要があります。

@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 の組み合わせに対する解決策ではないようです。

これに対処する正しい方法は何ですか?

4

2 に答える 2