본문 바로가기
스프링과 JPA 기반 웹 어플리케이션 개발/1부 (개발환경, 회원가입, 로그인, 계정설정)

10. 회원 가입: 가입 완료 후 자동 로그인

by Backchus 2020. 4. 18.

목표

  • 회원 가입 완료시 자동 로그인
  • 이메일 인증 완료시 자동 로그인

스프링 시큐리티 관점에서 로그인

  • SecurityContext에 Authentication(Token)이 존재하는가?
  • UsernamePasswordAuthenticationToken

  • 이메일 인증을 하지 않은 사용자의 자동 로그인은 "인증" 경고 창 보여주기
  • 이메일 인증을 마친 사용자의 자동 로그인 깔끔!
  • 메인 네비게이션 메뉴의 변경

AccountController 수정

package me.weekbelt.studyolle.account;

@RequiredArgsConstructor
@Controller
public class AccountController {
    
    // 기존 코드...........
    
    @PostMapping("/sign-up")
    public String signUpSubmit(@Valid SignUpForm signUpForm, Errors errors) {
        if (errors.hasErrors()) {
            return "account/sign-up";
        }

        Account account = accountService.processNewAccount(signUpForm);  // 추가
        accountService.login(account);                                   // 추가
        return "redirect:/";
    }

    @GetMapping("/check-email-token")
    public String checkEmailToken(String token, String email, Model model) {
       
       // 기존 코드 .......
       
       account.completeSignUp();       
       accountService.login(account);    // 추가
       model.addAttribute("numberOfUser", accountRepository.count());
       model.addAttribute("nickname", account.getNickname());

       return view;
    }
}

 

AccountService 수정

package me.weekbelt.studyolle.account;

@RequiredArgsConstructor
@Service
public class AccountService {
    
    // 기존 코드 ............
    
    @Transactional
    public Account processNewAccount(SignUpForm signUpForm) {  // 반환형을 Account 로 수정
        Account newAccount = saveNewAccount(signUpForm);
        newAccount.generateEmailCheckToken();
        sendSignUpConfirmEmail(newAccount);
        return newAccount;                                     // 추가                              
    }

    // 기존 코드 ..........

    // 로그인 로직 추가
    public void login(Account account) {
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                account.getNickname(),
                account.getPassword(),
                List.of(new SimpleGrantedAuthority("ROLE_USER")));
        SecurityContext context = SecurityContextHolder.getContext();
        context.setAuthentication(token);
    }
}

 

AccountControllerTest에 security관련 코드 추가

package me.weekbelt.studyolle.account;

@Transactional
@AutoConfigureMockMvc
@SpringBootTest
class AccountControllerTest {
    
    // 기존 코드 ......
    
    @DisplayName("회원 가입 화면 보이는지 테스트")
    @Test
    public void signUpForm() throws Exception {
                // 기존 코드 ........
                .andExpect(unauthenticated());    // 추가
    }

    @DisplayName("회원 가입 처리 - 입력값 오류")
    @Test
    public void signUpSubmit_with_wrong_input() throws Exception {
                // 기존 코드 ........
                .andExpect(unauthenticated());    // 추가
    }

    @DisplayName("회원 가입 처리 - 입력값 정상")
    @Test
    public void signUpSubmit_with_correct_input() throws Exception {
                // 기존 코드 ........
                .andExpect(authenticated().withUsername("joohyuk"));    // 추가

        // 기존 코드 .......

    }

    @DisplayName("인증 메일 확인 - 입력값 오류")
    @Test
    public void checkEmailToken_with_wrong_input() throws Exception {
                // 기존 코드 .......
                .andExpect(unauthenticated());    // 추가
    }

    @DisplayName("인증 메일 확인 - 입력값 정상")
    @Test
    public void checkEmailToken_with_correct_input() throws Exception {
                // 기존 코드 ........
                .andExpect(authenticated().withUsername(account.getNickname()));    // 추가
    }
}

 

 

참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#

 

스프링과 JPA 기반 웹 애플리케이션 개발 - 인프런

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습니다. 이 강좌를 충분히 학습한다면 여러분 만의 웹 서비스를 만들거나 취직에 도움이 될만한 포트폴리오를 만들 수 있을 겁니다. 활용 웹 개발 프레임워크 및 라이브러리 Java Spring Spring Boot Spring Data JPA Thymeleaf 온라인 강의 스

www.inflearn.com