Spring Securityで、Controller以外で現在ログイン中のユーザ情報を取得する方法

こんにちは。 エキサイト株式会社の三浦です。

Spring Securityを使えば、Spring Bootで簡単にログイン機構を作ることができます。

当然ログイン中のユーザ情報も取得することができます。

Controllerのメソッドの引数から取得する方法が一般的な方法の1つかと思うのですが、実はもっと簡単な方法があります。

import org.springframework.security.core.context.SecurityContextHolder;

public class Sample {
    public User getLoggedInUser() {
        // これだけでユーザ名を取得可能!
        final String name = SecurityContextHolder.getContext().getAuthentication().getName();

        // DB等からユーザ情報を取得する処理
        return getUser(name);
    }
}

上記のように

SecurityContextHolder.getContext().getAuthentication().getName();

を使えば、簡単に現在ログイン中のユーザ名を取得することができます。

(なお、本処理はWebMVCで実行しています。WebFluxの場合は処理が違うようなのでご注意ください。)

Controllerの引数から取得すると、他のクラスやメソッドに引き回す手間が掛かってしまいますが、この方法であればどの場所からもログインユーザ情報を取得できるのでとても便利です。

Spring Securityには色々便利な機能が存在するので、ぜひ使っていきましょう!