Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Thread Multiplexing
- rainbow table
- 문자열 리터럴
- python-socketio
- sql-mappler
- 함수형 인터페이스
- 쓰레드 라이브러리
- 롬복주의점
- functional interface
- 운영체제
- 프로세스
- AOP
- FunctionalInterface
- hiberbate
- SystemCall
- spring-data-jpa
- custom annotation
- ReflectUtils
- strict stubbing
- none이미지
- Spring
- OS
- Thread Library
- java.util.function
- 도커
- task_struct
- Process
- @Header
- django-crontab
- 문자열 불변성
Archives
- Today
- Total
JH's Develog
[Spring Security] HandlerMethodArgumentResolver로 Authentication에서 Principal 정보 가져오기 본문
Spring
[Spring Security] HandlerMethodArgumentResolver로 Authentication에서 Principal 정보 가져오기
jhkimmm 2022. 4. 14. 01:05Spring Security로 JWT 토큰을 사용하면 Authentication 정보를 메서드의 파라미터로 받아올 수 있습니다.
다만 매번 Authentication에서 Principal 정보를 꺼내쓰는 코드를 작성하면 코드의 중복이 심하므로 HandlerMethodArgument를 이용해서 Principal을 바로 메서드의 파라미터로 받아오는 방법을 알아보겠습니다.
0. HandlerMethodArgumentResolver의 구성요소
HandlerArgumentResolver 인터페이스는 두 개의 메서드를 구현해줘야합니다.
boolean supportsParameter(MethodParameter parameter);
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
supportParameter는 해당 클래스가 파라미터로써 사용될 수 있는지 체크하는 메서드이고,
resolveArgument에서 실제 주어진 request로 부터 메서드의 파라미터를 Resolve 하게 됩니다.
1. HandlerMethodArgumentResolver구현하기
저의 경우에는 Filter 단에서 Authentication의 Principal에 User객체를 넣어주었으므로
Authentication의 Principal을 바로 리턴하였습니다.
@Component
public class AuthenticationArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
//UserDto 객체를 파라미터로 받을 수 있도록 허용함
return UserDto.class.isAssignableFrom(parameter.getParameterType());
}
@Override
public Object resolveArgument(
MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory
) throws Exception {
final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication == null){
throw new RuntimeException;
}
return authentication.getPrincipal();
}
}
2. WebMvcConfigurer에 Resolver 등록하기
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new AuthenticationArgumentResolver());
}
}
스프링 부트에서 Resolver를 인식할 수 있도록 등록해줍니다.
3. 사용법
<Before>
@PostMapping
public ResponseEntity<Void> createNoteBook(
@Valid @RequestBody NoteBookDto noteBookDto,
Authentication authentication
){
User user = (User) authentication.getPrincipal();
//서비스 로직 ..
return ResponseEntity.ok().build();
}
원래는 위처럼 일일히 Authentication을 User 객체로 변환하는 코드를 추가해줘야 했지만,
<After>
@PostMapping
public ResponseEntity<Void> createNoteBook(
@Valid @RequestBody NoteBookDto noteBookDto,
UserDto userDto
){
//서비스 로직 ..
return ResponseEntity.ok().build();
}
HandlerMethodArgumentResolver를 만들고나면 컨트롤러에서 UserDto 객체를 파라미터로 바로 받아서 사용할 수 있습니다.
'Spring' 카테고리의 다른 글
[Spring Security] Filter 에서 발생한 예외 핸들링하기 (1) | 2022.05.20 |
---|---|
[Spring] Mockito의 Strict Stubbing과 lenient의 차이는? (0) | 2022.05.12 |
[SpringBoot] Entity 속성정보 상속받기 (0) | 2022.04.07 |
[Spring Security] Bcrypt의 salt는 어디에 저장될까? (4) | 2022.01.31 |
[Spring Data JPA] Querydsl 세팅하기 (Springboot+mysql) (0) | 2022.01.30 |
Comments