일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Spring
- 그래프큐엘
- 동적파라미터
- ioc컨테이너
- 기능적 요구사항
- 소프트웨어의 품격
- 도커 이미지 빌드
- kotlin 리팩터링
- 스프링 시큐리티 설정
- 정적팩토리메서드
- 비기능적 요구사항
- open-session-in-view
- 스프링di
- kotlin ::
- java predicate
- jpa lazy
- Atomicity
- jpa no session
- 자바 필터
- 토비의 스프링
- 수정자주입
- 스프링 포매터
- 생성자주입
- 스프링부트 도커
- 스프링
- 스프링시큐리티
- spring formatter
- fetch join
- method refetence
- IOC
Archives
- Today
- Total
공부기록
Security가 관련되어 있는 테스트 시 WithSecurityContextFactory 활용. 본문
반응형
문제점
- 테스트 시 현재 로그인된 사용자가 있다는 전제로 테스트를 한다면?
- 테스트 내부에서
SecurityContextHolder.context
등에UsernamePasswordAuthenticationToken
을 set 해주고.. 어쩌구 저쩌구.. 테스트가 몇 개 없다면 상관없지만, 테스트가 여러 개 있다면? 일일히 다 해줘야하나? WithSecurityContextFactory
를 이용하자.
- 테스트 내부에서
코드
WithAccountSecurityContextFactory.class
/**
* @author : Eunmo Hong
* @since : 2020/07/26
*/
@RequiredArgsConstructor
public class WithAccountSecurityContextFactory implements WithSecurityContextFactory<WithAccount> {
private final AccountService accountService;
@Override
public SecurityContext createSecurityContext(WithAccount annotation) {
String nickname = annotation.value();
String email = nickname + "@email.com";
String password = "11111111";
JoinAccountRequest joinAccountRequest = new JoinAccountRequest(email, nickname, password, password);
accountService.join(joinAccountRequest);
UserDetails userDetails = accountService.loadUserByUsername(email);
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
SecurityContext context = SecurityContextHolder.createEmptyContext();
context.setAuthentication(authentication);
return context;
}
}
WithAccount
@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory = WithAccountSecurityContextFactory.class)
public @interface WithAccount {
String value();
}
테스트
StudyApiControllerIntegrationTest
...
@DisplayName("스터디 참가 성공")
@WithAccount("joiner")
@Test
void joinStudyTest() throws Exception {
Account account = accountRepository.findByNickname("joiner").get();
CreateStudyRequest request = createStudyRequest(10, 12);
Long studyAccountId = studyService.createStudy(request, account);
StudyAccount studyAccount = studyAccountRepository.findById(studyAccountId).get();
Long studyId = studyAccount.getStudy().getId();
mockMvc.perform(post("/api/study/member")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(joinStudyRequest(studyId))))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.studyAccountId").exists());
}
...
- 이미
WithAccountSecurityContextFactory
에서 가입도 진행했고,SecurityCOntextHolder
에Authentication
을 set 해줬기 때문에 이와 같은 코드를 작성할 수 있다.
반응형
'Spring' 카테고리의 다른 글
@DataJpaTest는 임베디드 디비를 쓴다 (1) | 2020.08.04 |
---|---|
[SPRING] 스프링부트로 도커 이미지 만들기. (4) | 2020.06.02 |
YAML 파일을 변수에 매핑하기. (@Value, @ConfigurationProperties) (0) | 2020.03.15 |
HTTP2로 요청을 보내보자 (0) | 2020.01.29 |
ResourceLoader (2) | 2020.01.22 |