@Schema(hidden = true)
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthenticatedUserId {
}
@Schema(hidden = true)
: 이 애노테이션은 @AuthenticatedUserId 애노테이션이 Swagger 또는 OpenAPI 문서에서 숨겨지도록 합니다.
@Target(ElementType.PARAMETER)
: 애노테이션이 메서드의 매개변수(Parameter)에서만 사용될 수 있도록 지정합니다. 다른 위치(예: 클래스, 메서드 등)에는 사용할 수 없습니다.
@Retention(RetentionPolicy.RUNTIME)
: 이 애노테이션은 @AuthenticatedUserId 애노테이션이 런타임(runtime) 동안 유지되어야 함을 의미합니다. 즉, 애노테이션이 컴파일된 후에도 실행 중에 반영될 수 있습니다.
@Component
public class UserIdArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(AuthenticatedUserId.class);
}
@Override
public Object resolveArgument(
MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory
) {
/**
* 사용자가 로그인하지 않거나 인증되지 않은 상태에서는 Spring Security는 Authentication 객체를 anonymousUser로 설정합니다.
* 이 객체의 getPrincipal() 메서드는 "anonymousUser" 문자열을 반환합니다.
*/
if (SecurityContextHolder.getContext().getAuthentication().getPrincipal().equals("anonymousUser")) {
throw new NotSignedInException("anonymousUser");
}
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
// getPrincipal()의 반환 타입이 Object이므로, 실제 사용하는 타입인 UserDetails로 캐스팅하여 사용 (일반적으로 UserDetails로 인식하면됨)
// 인증된 사용자에 대한 더 많은 세부 정보를 얻기 위해 캐스팅을 통해 접근
return userDetails.getUsername();
}
}
특정 컨트롤러 메서드의 매개변수를 자동으로 처리하는 방법을 정의할 때 사용합니다.
supportsParameter 메서드
는 주어진 매개변수가 @AuthenticatedUserId 애노테이션을 가지고 있는지 확인합니다. 붙어있으면 true를 반환하고 resolveArgument메서드가 작동합니다.
resolveArgument 메서드
는 매개변수를 해결하고 반환하는 로직을 구현합니다. 여기서의 return 값이 매개변수에 삽입됩니다.