일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 비사이드프로젝트
- spring boot
- 도메인 주도 설계(DDD) 기반 마이크로서비스(MSA) 모델링
- springboot
- 멀티프로세싱
- Apple 로그인
- 멀티태스킹
- OpenFeign
- 오블완
- asciidoctor
- REDIS
- FeignClients
- 네이버클라우드 서버
- Spring Reactive Programming
- 비동기
- 프로세스
- ExecutorService
- 사이드 프로젝트
- microsoft
- ExceptionHandlerFilter
- JWT
- querydsl
- 코드로 배우는 스프링 부트 웹 프로젝트
- 2024년 상반기 회고
- 멀티스레드
- Spring Security
- 티스토리챌린지
- OAuth2.0
- 스레드
- Spring Cloud OpenFeign
- Today
- Total
기록하기
Controller 테스트 시 인증 정보 주입(Spring Security + JWT) 본문
프로젝트를 수행하던 중 REST docs 설정을 한 뒤 간단한 ControllerTest 코드를 수행해보았으나 build 가 되지 않는 문제점을 발견했다.
오류의 주 내용은, 빈 주입이 잘 되지 않아서 security 설정에서 문제가 발생함을 알게 되었고 Spring Security + JWT 방식으로 인증, 인가 기능을 활용했던 프로젝트에서 인증된 정보를 제공받지 않고서는 단위테스트를 실행할 수 없음을 알게 되었다.
따라서 미리 설계해둔 custom 한 UserDetailsService 클래스(필자의 경우 UserService 라는 이름으로 설계를 했다.) 에서 인증 정보를 먼저 제공받은 뒤 테스트를 실행할 수 있도록 처리가 필요했다.
@Service
@RequiredArgsConstructor
public class UserService implements UserDetailsService {
...
}
@WithUserDetails
spring.io 에서의 공식문서에 의하면, "custom UserDetailsService 로 UserDetails 와 커스텀 타입을 모두 구현한 객체를 반환한다. 이런 상황에선 custom UserDetailsService 로 테스트 사용자를 만들 수 있어야 한다." 라고 되어 있으며 이게 바로 @WithUserDetails 가 하는 일이라고 되어있다.
필자의 경우, @WithUserDetails(value = "custom 한 username", userDetailsServiceBeanName = "custom 한 UserDetailsService 를 빈으로 등록시 사용한 이름") 으로 설정을 해주었다.
@PostConstruct
@WithUserDetails(value = "01012341234", userDetailsServiceBeanName = "userService")
public void setUp() throws Exception {
Optional<Member> member = memberMapper.findByHp("01012341234");
}
그리고 실행 시점에 대해서 고민하던 중 이 블로그를 참고하여 @PostConstruct 어노테이션을 추가하여 빌드를 했는데 Bean 의 순서 결정법에 대해 정리해 볼 필요성을 느꼈다.
@PostConstruct
먼저 PostConstruct 입니다.
이 어노테이션을 메소드 선언부에 붙여주게 되면, 빈이 생성되고 의존성 주입까지 완료된 이후에 실행되는 초기화 메소드임을 의미하게 된다.
@DependsOn
해당 클래스에 이 어노테이션과 함께 value = {빈 이름} 을 명시해주면 이 클래스가 value 에 적힌 빈에 의존하고 있다는 것을 알려주게 되는데 여러 곳에 작성을 하게 되면 헷갈릴 수도 있으며 순환 참조가 생길 수도 있다.
@Order
여러 Bean 들이 어느 한 객체로 주입될 때 순서를 정할 수 있다.
여기서 @PostConstruct 의 경우 빈 사이클에서 오직 한 번만 수행된다는 것을 보장할 수 있으며 빈이 초기화 됨과 동시에 의존성을 확인할 수 있다는 장점을 갖고 있다.
참고
https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/test-method.html
11. Testing Method Security
This section demonstrates how to use Spring Security’s Test support to test method based security. We first introduce a MessageService that requires the user to be authenticated in order to access it. The result of getMessage is a String saying "Hello" t
docs.spring.io
JWT Spring-Security-Test로 테스트시 인증정보 주입
스프링 시큐리티를 적용한 토이 프로젝트에서 JWT로 인증,인가 기능을 부여한 컨트롤러를 테스트하는 과정에서 간단하게 Spring-Security-Test에 @WithMockUser를 사용하면 테스트에 필요한 인증된 인증
shrewd.tistory.com
'Server > Spring Boot' 카테고리의 다른 글
EhCache - StringCacheKeyGenerator 사용 시 @Cacheable 적용 (0) | 2022.09.18 |
---|---|
logback 설정 - 특정 변수에 따라 log 파일 다른 위치에 저장하기 (0) | 2022.08.25 |
ExceptionHandlerFilter 적용(3) (0) | 2022.07.10 |
ExceptionHandlerFilter 적용(2) (0) | 2022.07.03 |
ExceptionHandlerFilter 적용(1) (0) | 2022.06.19 |