더북(TheBook)

그렇다면 어떻게 인증된 요청을 수행할 수 있을까? 스프링 시큐리티는 이때 사용할 수 있는 애너테이션 두 개를 제공한다.

@WithMockUser : 지정한 사용자 이름, 패스워드, 권한으로 UserDetails를 생성한 후 보안 컨텍스트를 로드한다.

@WithUserDetails : 지정한 사용자 이름으로 UserDetails 객체를 조회하여 보안 컨텍스트를 로드한다.

 

둘 모두 스프링 시큐리티의 보안 컨텍스트는 해당 애너테이션을 붙인 테스트 메서드를 작동하는 동안 사용될 UserDetails 객체와 함께 로드한다. 보통은 @WithMockUser 애너테이션을 사용한다. 이 애너테이션으로 UserDetails를 보안 컨텍스트에 로드하도록 명시적으로 선언할 수 있다.


@Test
@WithMockUser(username="craig", password="password", roles="READER")
public void homePage_authenticatedUser() throws Exception {
    ...
}

이처럼 @WithMockUser 애너테이션은 일반적인 UserDetails 객체 조회를 건너뛰고 대신 지정된 값으로 UserDetails를 생성한다. 간단한 테스트라면 이 방법도 괜찮다. 하지만 여기서 수행할 테스트에는 @WithMockUser가 생성하는 일반적인 UserDetails가 아니라 UserDetails를 구현한 Reader가 필요하다. 그러므로 @WithUserDetails 애너테이션을 사용해야 한다.

@WithUserDetails 애너테이션은 UserDetails 객체를 로드하도록 구성된 UserDetailsService를 사용한다. 3장을 떠올려 보면, 지정한 사용자 이름으로 Reader 객체를 조회하여 반환하는 UserDetailsService 빈을 구성했다. 완벽하다! 이제 코드 4-4와 같이 테스트 메서드에 @WithUserDetails 애너테이션을 붙이자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.