개발 공부 기록
[SpringBoot] Argument Resolver을 통해 로그인한 유저 정보 가져오기 본문
Spring/Development Log
[SpringBoot] Argument Resolver을 통해 로그인한 유저 정보 가져오기
나만없서고냥이 2023. 12. 18. 01:25컨트롤러에서 어노테이션이 달린 파라미터를 통해 로그인한 사용자의 정보를 쉽게 가져오려고 합니다. 이때 어노테이션을 직접 만들어, 컨트롤러의 메서드 파리미터에서 로그인한(인증된) 유저의 정보를 가져오도록 하겠습니다.
✔️ Annotation 만들기
@Target(value = ElementType.PARAMETER)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
- @Target : 어노테이션이 적용될 수 있는 대상을 지정합니다. 여기서는 우리가 만든 어노테이션이 메서드의 파라미터에 적용될 수 있음을 의미합니다.
- @Retention : 어노테이션의 유지 기간을 나타냅니다. 'RetentionPolicy.RUNTIME'을 사용하면 런타임 시에도 어노테이션 정보가 유지됨을 의미합니다.
✔️ UserEmailDto.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserEmailDto {
private String email;
}
로그인한 사용자의 이메일 정보를 가져오는 것이 목적이기에, 위와 같은 DTO를 만들었습니다.
✔️ LoginUserArgumentResolver.java
@Component
@RequiredArgsConstructor
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
public static final String PREFIX = "Bearer ";
private final JwtTokenizer jwtTokenizer;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(LoginUser.class) &&
parameter.getParameterType() == UserEmailDto.class;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
String authentication = webRequest.getHeader(HttpHeaders.AUTHORIZATION);
String token = authentication.substring(PREFIX.length());
String email = jwtTokenizer.extractEmailFromToken(token);
return new UserEmailDto(email);
}
}
위 클래스는 Controller 메서드의 파라미터를 해결하는 데 사용됩니다.
- supportsParameter() : 파라미터가 위에서 만든 @LoginUser 어노테이션을 가지고 있는지 확인합니다. @LoginUser가 사용되었다면 true를 반환하여 위 resolver가 파라미터를 해결하는데 사용될 수 있습니다.
- resolveArgument() : Http 요청의 header에서 토큰을 추출하고, 해당 토큰으로부터 email을 추출하여 위에서 만든 UserEmailDto 객체로 만들어 반환합니다.
✔️ WebMvcConfiguration.java
@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {
private final JwtTokenizer jwtTokenizer;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new LoginUserArgumentResolver(jwtTokenizer));
}
}
WebMvcConfigurer를 구현한 클래스에서 위에서 만든 LoginUserArgumentResolver를 Argument Resolver로 등록합니다.
✔️ 컨트롤러에 적용
@PostMapping("/upload")
public void createItem(@LoginUser UserEamilDto userEmailDto) {
fileService.uploadFiles(file, userEmailDto);
}
위와 같이 인증한 사용자의 정보가 담긴 DTO를 활용할 수 있습니다.
'Spring > Development Log' 카테고리의 다른 글
[SpringBoot] SpringBoot에서 Redis 사용하기(1) (1) | 2023.12.20 |
---|---|
[SpringBoot] Interceptor 적용하기 (1) | 2023.12.19 |
[SpringBoot] AccessDeniedHandler와 AuthenticationEntryPoint 구현 (0) | 2023.12.13 |
[Spring / JWT] Access Token과 Refresh Token (0) | 2023.12.09 |
[Spring] Session 기반과 JWT 기반의 인증 (0) | 2023.12.09 |