본문 바로가기
IT/Spring

MockMvc 에 Spring Security Filter Chain 적용

by 최고영회 2020. 3. 26.
728x90
반응형
SMALL

Rest Docs 를 이용해 API 서버에 대한 테스트와 동시에 문서를 만들고 있다.

MockMvc 를 통해 각 API 에 대해서 쉽게 테스트 할 수 있다.

어느정도의 테스트가 완료 되고 이제 사용자 권한별 API 테스트를 진행하는데

@PreAuthorize("hasRole('ADMIN')")

위와 같이 annotation을 통해 API method에 대해 권한을 체크하도록 했는데 계속 오류가 발생한다...

이상하다.. SecurityContext 에서 권한을 찾을 수가 없다니.. 왜지?

그동안 jwt 를 통해 인증을 하고 jwtfilter 를 통해 Roles 을 부여 했었는데..

Boot 를 start 하고 postman 을 통해 테스트 해 보니 ... 잘된다.. 응???? 응???

다시 테스트 해보고 로그를 찍어보니 이상하게도 jwt 인증 filter chain 이 걸리지 않았다.

테스트 코드의 MockMovc 생성 부분을 살펴 보니 아래와 같았다.

@Before 
public void setUp() throws ServletException { 
  this.document = document("{class-name}/{method-name}", 
           preprocessRequest(prettyPrint()),
           preprocessResponse(prettyPrint())); 
  this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) 
                 .apply(documentationConfiguration(this.restDocumentation)) 
                 .alwaysDo(document) 
                 .build(); 
}

아... MockMvc 에 spring security filter chain 을 추가 해 줘야 하는구나..

@Before 
public void setUp() throws ServletException { 
  this.document = document("{class-name}/{method-name}", 
       preprocessRequest(prettyPrint()), 
       preprocessResponse(prettyPrint())); 
  DelegatingFilterProxy delegateProxyFilter = new DelegatingFilterProxy(); 
  delegateProxyFilter.init(
  		new MockFilterConfig(context.getServletContext(), BeanIds.SPRING_SECURITY_FILTER_CHAIN)); 
  this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) 
                 .apply(documentationConfiguration(this.restDocumentation)) 
                 .addFilter(delegateProxyFilter) 
                 .alwaysDo(document) 
                 .build(); 
}

다시 테스트,, 잘된다.!!

 

728x90
반응형
LIST