0
0

More than 3 years have passed since last update.

インターセプタークラスでkeycloakの認証情報を取得する方法

Last updated at Posted at 2020-03-10

keycloak認証からユーザーの認証情報を持った状態でAPIにリクエストを投げた際、
controllerクラスのメソッド呼び出される前にintercepter(インターセプター)から
ユーザー情報を取得するのにgetUserPrincipal()メソッドがあることを知らず手こずったのでメモ。

intercepterTestClass.java

  @Autowired
  private UserDto userDto;

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
    //

    //認証情報を持っていない場合は
    if (request.getUserPrincipal() == null) {
      System.out.println("認証情報なしの為、ダミー設定");
      userDto.setUserid("U0001");
      userDto.setUserName("guest");
      return true;
    }

    //
    final KeycloakSecurityContext context = KeycloakPrincipal.class.cast(request.getUserPrincipal()).getKeycloakSecurityContext();

    userDto.setUserName(context.getToken().getPreferredUsername());
    userDto.setUserId(String.valueOf(context.getToken().getOtherClaims().get("user_id")));

    //
    return true;

keycloak認証の実装については別記事参照。インターセプターで認証情報を取得することで
各Controllerクラスに記述する必要がなくなって汎用性はよくなった。
今まで認証機能はSpringSecurityしか使って来なかったけど、
APIの実装だとSpringSecurityはあんまり適さないみたい。

※ちなみにintercepterTestClass下部でtoString()ではなく、String.valueOfでユーザーIDを
取得しているのは、nullだった時にtoString()だとヌルポで落ちる為。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0