LoginUserRequestFilter.java

package io.extact.rms.external.webapi.jwt;

import java.io.IOException;

import jakarta.annotation.Priority;
import jakarta.ws.rs.ConstrainedTo;
import jakarta.ws.rs.Priorities;
import jakarta.ws.rs.RuntimeType;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.container.ContainerResponseFilter;

import org.eclipse.microprofile.jwt.JsonWebToken;

import lombok.extern.slf4j.Slf4j;

import io.extact.rms.application.common.LoginUserUtils;
import io.extact.rms.application.common.ServiceLoginUser;
import io.extact.rms.platform.jwt.consumer.JwtValidateRequestFilter;

/**
 * 検証済み{@link JsonWebToken}から{@link ServiceLoginUser}を生成し<code>ThreadLocal</code>
 * に設定するフィルタークラス。
 * このフィルターは前段に{@link JwtValidateRequestFilter}が実行されていることを
 * 前提にしている。
 */
@Priority(Priorities.AUTHENTICATION + 10) // JwtSecurityRequestFilterの後
@ConstrainedTo(RuntimeType.SERVER)
@Slf4j
public class LoginUserRequestFilter implements ContainerRequestFilter, ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        var jsonWebToken = (JsonWebToken) requestContext.getSecurityContext().getUserPrincipal();
        ServiceLoginUser loginUser = ServiceLoginUser.UNKNOWN_USER;
        if (jsonWebToken != null) {
            loginUser = ServiceLoginUser.of(Integer.parseInt(jsonWebToken.getSubject()), jsonWebToken.getGroups());
        }
        log.debug("set loginUser to ThradLocal");
        LoginUserUtils.set(loginUser);
    }

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        log.debug("remove loginUser from ThradLocal");
        LoginUserUtils.remove();
    }
}