1. 概要

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

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

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

始める前に、このサイトの登録シリーズの範囲内で作業していることに注意してください。

2. HttpServletRequestの使用

プログラムで認証を強制する非常に簡単な方法は、 HttpServletRequest 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を使用する

次に、 UsersnamePasswordAuthenticationToken を直接作成してから、標準の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::getPrivileges)
      .flatMap(Collection::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. 結論

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

いつものように、完全なソースコードはGitHubから入手できます。