WithSecurityContext
- 테스트 코드를 짜면서 스프링 시큐리티 로그인정보를 필요로 하는 경우가 있는데 @WithMockUser, @WithUserDetails 를 사용하여 인증된 유저를 바탕으로 테스트가 진행가능하다.
- 하지만, 나의 경우 WithSecurityContext를 커스텀하여 userDetails를 구현한 Member객체로 사용하기 위해 아래와 같이 어노테이션을 추가함
WithMockMember
@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory = WithSecurityContextFactoryImpl.class)
public @interface WithMockMember {
long id() default 1L;
String loginId() default "user";
String password() default "user1234";
String name() default "username";
String email() default "user@user.com";
}
WithSecurityContextFactoryImpl
@Component
public class WithSecurityContextFactoryImpl implements WithSecurityContextFactory<WithMockMember> {
@Autowired
MemberService memberService;
@Autowired
MemberDetailsServiceImpl memberDetailsService;
@Override
public SecurityContext createSecurityContext(WithMockMember annotation) {
// 회원가입 처리
Member member = Member.builder()
.loginId(annotation.loginId())
.password(annotation.password())
.name(annotation.name())
.email(annotation.email())
.build();
MemberRequest memberRequest = new MemberRequest(member);
memberService.join(memberRequest);
// 시큐리티 로그인 처리
final SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
UserDetails userDetails = memberDetailsService.loadUserByUsername(annotation.loginId());
final UsernamePasswordAuthenticationToken authenticationToken
= new UsernamePasswordAuthenticationToken(userDetails,userDetails.getPassword(),userDetails.getAuthorities());
securityContext.setAuthentication(authenticationToken);
return securityContext;
}
}
WithMockMember사용
@Test
@DisplayName("회원정보 수정")
@WithMockMember
public void updateMember() {
// given
Member member = (Member)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
// when
String updateName = "updatedUser";
MemberRequest updateMember = MemberRequest.builder()
.loginId(member.getLoginId())
.password(member.getPassword())
.name(updateName)
.email(member.getEmail())
.build();
memberService.updateMember(member,updateMember);
// then
assertThat(member.getName()).isEqualTo(updateName);
}
'Spring > SpringBoot' 카테고리의 다른 글
[SpringBoot] Interceptor 설정하기 (0) | 2024.03.21 |
---|---|
[Spring Boot] @ConfigurationProperties (0) | 2024.03.15 |
[Spring Boot] Spring Security 6버전 셋팅 (0) | 2024.03.12 |
[SpringBoot] Gradle 설정 (0) | 2023.03.08 |
[SpringBoot] JPA (0) | 2023.03.08 |