spring security @AuthenticationPrincipal rest docs 질문
211
작성한 질문수 10
안녕하세요 강사님
강의를 굉장히 잘 들었던 수강생입니다. 다름이 아니라 최근 spring security 를 도입하고 난 뒤에 rest docs 에 대해 문제가 생겨 질문하게 되었습니다.
'회원 정보 조회' 라는 API 가 있고, 이 API 는 로그인을 한 뒤에 securityContextholder 에 담겨져 있는 객체를 사용하고자 파라미터로 @AuthenticationPrincipal 이라는 어노테이션을 이용하여 받고 있습니다.
그러나...restdocs 를 이용하여 해당 API 를 문서화 시키려고 할때 객체가 null 이 들어가서 테스트가 실패를 하게 되더라구요.
docs 가 아닌 일반 controller test 에서는 @SpringBootTest 를 사용하여 @WithUserDetails 를 통해 테스트를 통과했습니다.
그러나 @SpringBootTest 를 따로 사용하고 있지 않은 상황에서 어떻게 해결할 수 있을지 고민입니다 ㅠㅠ
감사합니다.
답변 2
1
안녕하세요, leeseongju 님!
구현하신 내용에 따라 방법은 여러가지가 될 수 있겠는데요. SecurityMockMvcRequestPostProcessors 나 @WithMockUser 등에 대해 학습해보고 적용해보시면 좋을 것 같아요.
참고 : 블로그
감사합니다 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
Spring Security와 관련된 RestDocs 테스트에서 발생하는 문제에 대해서 고민이 많으신 것 같습니다. 기본적으로, @AuthenticationPrincipal을 사용하는 경우 해당 파라미터에 올바른 사용자가 설정되어야 하기 때문에 문서화 테스트를 위한 별도의 설정이 필요합니다.
다행히도, Spring Security를 RestDocs와 함께 사용하면서 비슷한 문제를 해결하신 분들이 있습니다. 아래와 같은 방법으로 접근할 수 있습니다:
Spring Security 설정 추가: Security Context에 인증된 사용자가 필요하므로
MockMvc를 설정할 때 Spring Security를 추가로 구성해야 합니다. 이를 위해SecurityMockMvcConfigurers.springSecurity()를MockMvcBuilders에 추가해 보세요.@WithMockUser어노테이션 사용: 테스트 메소드에@WithMockUser어노테이션을 사용하여 임시 사용자 인증을 설정해 볼 수 있습니다. 이는@WithUserDetails와 유사하게 작동하지만 RestDocs 테스트 환경에서 더 적합할 수 있습니다.
예제 코드를 참고로 하시면 도움이 될 수 있습니다:
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
// 예제 테스트 메소드
@WithMockUser(username = "testUser", roles = "USER")
@Test
public void testUserInfoAPI() throws Exception {
mockMvc.perform(RestDocumentationRequestBuilders.get("/api/user/info")
.with(csrf()))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(document("user-info"));
}
이 방법을 사용하면, Spring Security와 RestDocs 간의 호환 문제를 해결할 수 있습니다.
관련 게시물로는 Spring Security 적용 시 controller @WebMvcTest와 Spring Security 를 포함한 WebMvcTest 질문드립니다. 등을 참고하시면 도움이 되실 겁니다. 두 게시물 모두 Spring Security를 활용한 테스트에서 맞닥뜨릴 수 있는 문제점과 해결 방법에 대해 심층적으로 다루고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
this.mockMvc = MockMvcBuilders.standaloneSetup(initController())
.apply(documentationConfiguration(provider))
.addFilter(springSecurityFilterChain)
.build();를 @SpringBootTest 를 추가해서
this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(documentationConfiguration(provider))
.build();로 변경하여 테스트 통과를 하긴 했습니다...security 를 도입하면 standaloneSetup 은 사용할 수 없는지 다시 확인해보긴 해야겠네요 ㅎㅎ 감사해요 AI
private 상수 테스트 관련 질문
0
82
1
void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??
0
124
2
커버리지는 어떻게 활용하시는지 궁금합니다.
0
159
2
테스트 문서화 질문입니다
0
104
2
단위테스트 질문이 있습니다
0
94
2
컨트롤러는 모킹을 한 이유가 궁금합니다.
0
100
2
ERD 가장자리에 있는 도메인 테스트 질문
0
86
2
DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?
0
131
2
OrderCreateRequest DTO에 대해서 궁금한점
0
101
2
고전파의 테스트 대역 사용 대상, 공유 의존성
0
154
2
계층 관련 질문이 있습니다.
0
137
3
'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다
1
122
2
혹시 update 로직은 어떻게 테스트하나요? (@Setter?)
0
133
2
단위테스트와 통합테스트의 경계가 궁금합니다.
0
226
2
Service+Repository 통합테스트 관련 질문입니다.
0
149
2
OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요
0
183
2
test 용 .yml
0
89
2
throws Exception
0
78
2
카페키오스크 클래스 문의 ,,
0
87
2
Rest docs 문서용 테스트코드를 따로 작성해야 되나요?
0
171
2
테스트 코드에서 필요한 생성자
0
136
1
tearDown 순서
0
114
2
@Builder 생성자 private
0
133
2
@DisplayName gradle / intellJ
0
91
2





