🔐 들어가며
안녕하세요! 이번 포스팅에서는 테스트할 때 Spring Security 인증을 할 수 있게 제공되는 어노테이션들을 소개하려고 합니다. 이 포스팅에서 다루는 어노테이션 목록은 다음과 같습니다.
@WithMockUser
: UserDetail 생성@WithAnonymousUser
: 익명의 유저 생성@WithUserDetails
: UserDetail 조회
👻 의존성 추가
testCompile('org.springframework.security:spring-security-test')
testCompile("org.springframework.boot:spring-boot-starter-test")
위 어노테이션들을 사용하기 위해 반드시 필요한 spring security test와, JUnit4를 사용하기 위해 필요한 starter test를 추가해줍니다.
👀 어노테이션 소개
@WithMockUser
위 어노테이션은 지정한 사용자 이름, 패스워드, 권한으로 UserDetails를 생성한 후 보안 컨텍스트를 로드합니다. 값을 지정하지 않을 시에는 아래와 같은 기본 값을 가지게 됩니다.
username
: userroles
: ROLE_USERpassword
: password
@WithMockUser(username = "테스트계정", password = "custom_password", roles = {"USER","ADMIN"})
@Test
public void testSecurity() throws Exception {
// test code
}
roles
에는 접두사로 ROLE_이 붙게 되는데, 접두사를 제외하고 싶으면 authorities
속성을 사용하면 됩니다.
@WithAnonymousUser
익명의 사용자로 테스트하고 싶을 때 사용합니다.
@WithAnonymousUser
@Test
public void testSecurity() throws Exception {
// test code
}
@WithUserDetails
지정한 사용자 이름으로 계정을 조회한 후에 UserDetails 객체를 조회하여 보안 컨텍스트를 로드하게 됩니다.
value
: 지정한 사용자 이름. 기본값은 useruserDetailsServiceBeanName
: UserDetails 조회 서비스의 빈 이름. 하나밖에 없다면 굳이 적지 않아도 된다.
@WithUserDetails(value = "test@a.b", userDetailsServiceBeanName = "userService")
@Test
public void testSecurity() throws Exception {
// test code
}
만약 테스트 시작 전에 유저 데이터를 임의로 넣어놓고 싶다면, @Before
대신 @BeforeTransaction
을 사용해야 합니다.@WithUserDetails
이 @Before
전에 실행되어서 유저 데이터를 넣기 전에 조회를 하기 때문입니다.
@Transactional
// ...
public class UserControllerTest {
@Autowired
public UserRepository userRepository;
private Long TEST_ACCOUNT_CODE;
@BeforeTransaction
public void accountSetup() {
TEST_ACCOUNT_CODE = userRepository.save(UserInfo.builder()
.email("test@a.b")
.auth("ADMIN")
.password("password").build()).getCode();
}
@AfterTransaction
public void accountCleanup() {
userRepository.deleteById(TEST_ACCOUNT_CODE);
}
@WithUserDetails(value = "test@a.b")
@Test
public void testSecurity() throws Exception {
// test code
}
}
위 코드처럼 @BeforeTransaction
을 사용해서 설정을 해주니 원하는대로 유저 정보 생성 - 조회의 순서를 거쳐 테스트를 진행했습니다. (이게 맞는 방법인지는 모르겠네요 ... 😅 혹시 아시는 분 있으면 댓글 부탁드립니다!)
✨ 맺으며
간편하게 사용할 수 있는 Spring Security 테스트 인증 관련 어노테이션들을 알아보았습니다.
혹시 글을 읽으면서 잘못된 내용이 있으면 댓글로 알려주시면 감사하겠습니다! 읽어주셔서 감사합니다! 😊
👏 참고링크
'Backend > SpringBoot' 카테고리의 다른 글
Spring Boot에서 JWT 사용하기 (10) | 2021.06.09 |
---|---|
JUnit4에서 JUnitParams 이용해서 파라미터 테스트하기 (0) | 2021.02.02 |
Spring Boot에서 Custom Valid Annotation 만들기 (0) | 2020.09.24 |
Spring Boot에서 이벤트 사용하기 (6) | 2020.08.27 |
Spring Boot에서 CORS 적용해보기 (7) | 2020.08.05 |