Spring Security - 登録後の自動ログインユーザー

1概要

このクイックチュートリアルでは、Spring Securityの実装で、登録プロセスの直後にユーザーを自動認証する方法について説明します。

簡単に言うと、ユーザーが登録を終了すると、通常はログインページにリダイレクトされるので、ユーザー名とパスワードをもう一度入力する必要があります。

代わりにユーザーを自動認証することでこれを回避する方法を見てみましょう。

始める前に、このサイトのリンク:/spring-security-registration[登録シリーズ]の範囲内で作業しています。

2 HttpServletRequest を使用する

プログラム的に認証を強制するための非常に簡単な方法は、 HttpServletRequest https://docs.oracle.com/javaee/6/api/javax/servlet/httptt/HttpServletRequest.html#login%28java.lang.String,%20javaを利用することです。 .lang.String%29[login()] メソッド:

public void authWithHttpServletRequest(HttpServletRequest request, String username, String password) {
    try {
        request.login(username, password);
    } catch (ServletException e) {
        LOGGER.error("Error while login ", e);
    }
}

これで、内部的には、 HttpServletRequest.login() APIは AuthenticationManager を使用して認証を行います。

このレベルで発生する可能性のある ServletException を理解して対処することも重要です。

3 AuthenticationManager を使用する

次に、 UsernamePasswordAuthenticationToken を直接作成してから、標準の AuthenticationManager を手動で実行することもできます。

public void authWithAuthManager(HttpServletRequest request, String username, String password) {
    UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password);
    authToken.setDetails(new WebAuthenticationDetails(request));

    Authentication authentication = authenticationManager.authenticate(authToken);

    SecurityContextHolder.getContext().setAuthentication(authentication);
}

トークン要求を作成し、それを標準の認証フローに渡してから、現在のセキュリティコンテキストに明示的に結果を設定する方法に注目してください。

4複雑な登録

より複雑なシナリオでは、登録プロセスに複数の段階があります。たとえば、ユーザーがシステムにログインできるまでの確認手順などです。

このような場合、もちろん、ユーザーを自動認証できる場所を正確に理解することが重要です。その時点では、新しく作成されたアカウントはまだ無効になっているため、登録後すぐにはできません。

簡単に言えば - ** アカウントを確認した後に自動認証を実行する必要があります。

また、その時点では、実際の生の資格情報にアクセスできなくなりました。ユーザーのエンコードされたパスワードにしかアクセスできない - それがここで使用するものです。

public void authWithoutPassword(User user){
    List<Privilege> privileges = user.getRoles().stream()
      .map(role -> role.getPrivileges())
      .flatMap(list -> list.stream())
      .distinct().collect(Collectors.toList());
    List<GrantedAuthority> authorities = privileges.stream()
        .map(p -> new SimpleGrantedAuthority(p.getName()))
        .collect(Collectors.toList());

    Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, authorities);
    SecurityContextHolder.getContext().setAuthentication(authentication);
}

AuthenticationProvider. で通常行われるように、ここで認証権限を適切に設定していることに注意してください。

5結論

登録プロセス後にユーザーを自動認証するさまざまな方法について説明しました。

いつものように、完全なソースコードはhttps://github.com/Baeldung/spring-security-registration[GitHubで利用可能]です。