본문 바로가기
SpringBoot/테스트코드

[SecurityTest]로그인 인증 테스트 방법

by devebucks 2020. 7. 19.
728x90

안녕하세요.

Spring-Security를 사용해서 로그인 인증 기능에 대한 테스트 방법에 대해서 알아보고자 합니다.

 

테스트 환경

- JUnit4

- MockMvc를 빈으로 주입받아 mock 테스트를 했습니다.

- 사전에 회원가입에 대한 테스트 코드가 필요합니다.

 

테스트코드에서 로그인 인증에 사용할 주요 메서드

import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.authenticated;

authenticated()

authenticated()를 사용해서 테스트하면, Security를 통해서 로그인만 되면, 해당 테스트 코드는 통과됩니다.

import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated;

unauthenticated()

Security를 통해서 로그인이 안된 경우에는 unauthenticated()메서드를 사용해서 테스트하면 됩니다.

 

 

테스트 코드

  • 테스트 코드
  • 제가 직접 작성한 "로그인 후에 이메일 재인증 요청페이지 테스트코드"(통과)
@DisplayName("이메일 재인증 페이지 정상 작동 확인")
@Test
public void 이메일재인증요청페이지_정상() throws Exception {
      //회원가입하고..
      Account account = Account.builder().nickname("wewewew").email("asdf@email.com").password("123123123").build();
      Account savedAccount = accountRepository.save(account);

      //로그인하고..
      accountService.login(savedAccount);

      //테스트
      mockMvc.perform(get("/recheck-email"))
              .andExpect(status().isOk())
              .andExpect(view().name("account/recheck-email"))
              .andExpect(authenticated());
}   

accountService.login(saveAccount)메서드의 경우,

1. UsernamePasswordAuthenticationToken을 생성하였고,

2. SecurityContext 객체를 SecurityContextHolder.getContext()를 통해서 만들어 주었고, 

3. SecurityContext객체의 setAuthentication()에 파라미터로 UsernamePasswordAuthenticationToken을 넣어서 Security로부터 로그인을 받았습니다.

 

  • 테스트 대상 요청 메서드
@GetMapping("/recheck-email")
    public String checkEmail(@CurrentUser Account account, Model model){
         model.addAttribute("email", account.getEmail());
         model.addAttribute("nickname", account.getNickname());
         return "account/recheck-email";
    }

 

 

  • @CurrentUser 어노테이션은 새로 정의한 어노테이션입니다.
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : account")

 

 

로그인 시 생성된 UsernamePasswordAuthenticationToken으로 찍힌 로그입니다.
Principal로 잡힌 UserAccount를 로그로 확인해봤습니다.
로그 끝에 보시면, Authenticated: true인 것을 확인 할 수 있었습니다.

 

Get 요청으로 "/recheck-email"을 요청하게 되면, Principal로 잡힌 로그인된 계정 객체를 참조하게 됩니다. 만약 계정 객체가 "null"이면, "redirect:/login"으로 자동으로 넘어가게 됩니다.

 

728x90

댓글