티스토리 뷰

☠️ Java

addArgumentResolvers

James Wetzel 2024. 11. 26. 16:22
728x90
반응형

addArgumentResolvers()

컨트롤러 메서드의 파라미터(Handler Method Argument)를 커스터마이즈하는 방법을 제공합니다.

public class JwtUserArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(User.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, org.springframework.web.bind.support.WebDataBinderFactory binderFactory) throws Exception {
        String token = webRequest.getHeader("Authorization");
        return JwtUtils.parseToken(token); // JWT 파싱 유틸리티 메서드 사용
    }
}

 

package com.example.demo.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

 

package com.example.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {
    private String username;
    private String role;
}

 

package com.example.demo.controller;

import com.example.demo.annotation.CurrentUser;
import com.example.demo.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/me")
    public String getCurrentUser(@CurrentUser User user) {
        // @CurrentUser를 통해 인증된 사용자 정보를 가져옴
        return String.format("Hello, %s! Your role is: %s", user.getUsername(), user.getRole());
    }

    @GetMapping("/admin")
    public String adminAccess(@CurrentUser User user) {
        // 관리자만 접근하는 페이지라 가정
        if ("ROLE_ADMIN".equals(user.getRole())) {
            return String.format("Welcome Admin, %s!", user.getUsername());
        } else {
            return "Access Denied.";
        }
    }
}

 

호출
GET /me

Response:
Hello, john_doe! Your role is: ROLE_USER

 

 

동작 설명

  1. 사용자가 /me 또는 /admin URL에 접근합니다.
  2. Spring Security는 인증 정보를 기반으로 Principal 객체를 제공합니다.
  3. CurrentUserHandlerMethodArgumentResolver가 Principal에서 사용자 정보를 추출하여
    User 객체를 생성하고 컨트롤러로 주입합니다.
  4. 컨트롤러는 주입받은 User 객체를 활용하여 요청에 응답합니다.
728x90
반응형