SecurityContextHolder에 임의의 인증 객체 사용

song yuheon·2023년 9월 21일
0

Spring

목록 보기
85/93
post-thumbnail

SecurityContextHolder에 임의의 인증 객체를 설정하여 사용하는 방법


@WithMockUser 어노테이션 사용


@WithMockUser 어노테이션을 사용하여 테스트 메서드에서 임의의 사용자로 실행할 수 있다.

@Test
@WithMockUser(username = "user1", roles = "USER")
public void testMethod() {
}

https://sasca37.tistory.com/291



트러블슈팅


Spring Security 테스트 환경에서 UserDetailsImpl 사용

  1. 문제
    테스트 코드 실행 시 ClassCastException 발생

    • 원인 = @WithMockUser를 사용하면 SecurityContextHolder에 설정되는 Authentication 객체의 principal은 스프링 시큐리티의 기본 UserDetails 구현(org.springframework.security.core.userdetails.User)으로 설정된다.
      따라서 테스트 코드에서 UserDetailsImpl로 형변환을 시도하면 예외가 발생한다.
  2. 해결 방법
    테스트 메서드 내에서 직접 SecurityContextHolder 설정

    @BeforeEach
    void SecurityUserTest() {
        User user = new User();
        user.setUsername("bin0016");
        user.setPassword("Bin@12345");
        user.setRole(UserRoleEnum.USER);

        UserDetailsImpl userDetails = new UserDetailsImpl(user);
        Authentication authentication =
                new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());

        SecurityContextHolder.getContext().setAuthentication(authentication);
    }
    @Test
    void escapeTest() {
        // given
        // when
        ResponseEntity<MessageDto> result =userService.escape();
        // then
        assertThat(result).isEqualTo(new ResponseEntity<>(new MessageDto("회원 삭제 성공"), null, HttpStatus.OK));
    }


  1. 교훈
    • 테스트 환경 설정이 실제 환경과 동일한지 항상 확인해야한다.
    • 테스트 환경에서 사용되는 보안 설정이 실제 환경과 동일한지 확인한다.
    • @WithMockUser나 다른 모의 보안 어노테이션을 사용할 때 해당 어노테이션이 설정하는 보안 컨텍스트가 테스트의 요구 사항과 일치하는지 확인해야한다.

profile
backend_Devloper

0개의 댓글