• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

로그인 인증 관련 질문

23.01.13 17:16 작성 조회수 653

0

기선님 안녕하세요~

테스트 코드로 로그인 인증 검증하는 코드 부분에서 잘 안되는 부분이 있어 문의드려요!

저는 빌드 도구 gradle, spring boot 3.0.1 버전, Java 17 버전으로 개발하고 있습니다.

UsernamePasswordAuthenticationToken 을 Nickname, Encryped Password를 통해 가져와서 SecurityContextHolder를 통해 token을 Set 해주는 코드가 아래와 같이 있습니다.

public void login(Account account) {
    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
        account.getNickname(),
        account.getPassword(),
        List.of(new SimpleGrantedAuthority("ROLE_USER")));
    SecurityContextHolder.getContext().setAuthentication(token);
}

 

SecurityMockMvcResultMatchers의 authenticated로 테스트 코드 계정 인증 시키는 부분에서 "Authentication should not be null" 이슈가 발생하네요.

디버깅 시도 해보면, mockMvc 마지막 검증(authenticated) 쪽에서는 분명 test라는 nickname도 갖고 있지만.. authenticated 호출되는 시점에 request Session을 가져오면 null이 나와버리네요 ㅠㅠ. 사용 중인 SecurityMockMvcResultMatchers 자체 버전은 다르긴 하지만.. 코드는 완전 동일한데 이런 오류가 발생하네요 ㅠ 혹시 해결을 위해 해볼 만한 시도가 있을까요~?

void checkEmailToken_with_correct_input() throws Exception {
        Account account = Account.builder()
                            .email("test@email.com")
                            .password("12345678")
                            .nickname("test")
                            .build();
        Account newAccount = accountRepository.save(account);
        newAccount.generateEmailCheckToken();

        mockMvc.perform(get("/check-email-token")
                .param("token", newAccount.getEmailCheckToken())
                .param("email", newAccount.getEmail()))
            .andExpect(status().isOk())
            .andExpect(model().attributeDoesNotExist("error"))
            .andExpect(model().attributeExists("nickname"))
            .andExpect(model().attributeExists("numberOfUser"))
            .andExpect(view().name("account/checked-email"))
            .andExpect(authenticated());
    }

답변 1

답변을 작성해보세요.

3

TryAgain님의 프로필

TryAgain

질문자

2023.02.12

해당 이슈는 자문 자답합니다.

Spring Security 5.x 버전에서의 SecurityContextPersistenceFilter는 SecurityContext 정보를 저장하지만, 6.x 버전에서 SecurityContextHolderFilter가 Deprecated 되어, SecurityContextPersistenceFilter가 사용되고 있어서 SecurityContext 정보가 저장되지 않더라고요.

읽기만 하니, mockMvc에서 검증할 수가 없었던 것,

 

사실 아래와 같이 HttpSessionSecurityContextRepository를 이용하라고 권고안에는 되어있는데 안되더라고요.

.securityContext((securityContext) -> securityContext .securityContextRepository(new HttpSessionSecurityContextRepository()) );

 

저는 우선 아래 설정을 적용하여 SecurityContext 저장 방식을 5.x 버전으로 구동되도록하여 해결은 하였습니다.

.securityContext((securityContext) -> securityContext .requireExplicitSave(false));

 

관련하여 혹시라도 찾고 계신 분들이 있다면 참고해주시고요~ 근본적인 설명이 가능한 부분이 있다면 함께 공유해도 좋겠네요~