Spring Boot Resource Server JWT 를 보기 좋게 바꾸기

HanHee Thomas Nam·2021년 11월 11일
0

OAuth2 기반의 스프링부트 Resource 서버를 만든 후 사용자의 정보가 필요하여 Authentication 을 받아보면... Jwt 객체가 나온다.

당장 권한과 사용자 아이디가 필요하지만.. Jwt 에 감싸져서 getClaimAsString 같은 함수를 호출하여야 데이터를 받아볼수 있다.

Authentication authentication = SecurityContextHolder.getContext ().getAuthentication ();

Jwt jwt = (Jwt) authentication.getPrincipal ();

jwt.getClaimAsString ("user_name");			// 아이디
jwt.getClaimAsStringList ("authorities");	// 권한

해당 값을 쓰려고 하면 귀찮다. HandlerMethodArgumentResolver 를 이용하여 쉽게 받아보게 해보자.

인증 사용자 정보를 받을 클래스

@Getter
@RequiredArgsConstructor
public class AuthUser
{
	private final String userName;

	private final List<String> authorities;
}

어노테이션 기반으로 Request 에서 받아오게 하기 위한 어노테이션

@Target (ElementType.PARAMETER)
@Retention (RetentionPolicy.RUNTIME)
public @interface LoginUser
{
}

Resolver 구현

@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver
{
	@Override
	public boolean supportsParameter (MethodParameter parameter)
	{
		return AuthUser.class.equals (parameter.getParameterType ()) && parameter.getParameterAnnotation (LoginUser.class) != null;
	}

	@Override
	public Object resolveArgument (MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception
	{
		Authentication authentication = SecurityContextHolder.getContext ().getAuthentication ();

		Jwt jwt = (Jwt) authentication.getPrincipal ();

		return new AuthUser (jwt.getClaimAsString ("user_name"), jwt.getClaimAsStringList ("authorities"));
	}
}

실제 메서드에서 데이터를 받아보자~

@GetMapping("/api/test-user")
public String helloTestUser (@LoginUser AuthUser authUser)
{
	System.out.println (authUser.getUserName ());
	System.out.println (authUser.getAuthorities ());

	return "Hello World!!! - " + authUser.getUserName ();
}

완료~~ 아자아자

profile
항상 배고픈 개발자입니다.

0개의 댓글