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;
}
@Target (ElementType.PARAMETER)
@Retention (RetentionPolicy.RUNTIME)
public @interface LoginUser
{
}
@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 ();
}
완료~~ 아자아자