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()だとヌルポで落ちる為。