프로젝트 정리/스프링과 JPA 기반 웹 애플리케이션 개발

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

출처 

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

 

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

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습

www.inflearn.com

github.com/devjun63/whiteship-studyolle/commit/a03c2a792c01002d66368475f3f7a55b898b8dd1

 

12. 회원 가입: 가입 완료 후 자동 로그인 · devjun63/whiteship-studyolle@a03c2a7

AccountService.login 메서드 생성 AccountController에서 가입, 메일 토큰 확인 시 적절한 값이 들어왔을 경우 로그인 처리 및 security SecurityMockMvcResultMatchers authenticated, unauthenticated andExpect test

github.com

 

 

목표

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

 

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

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

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

 

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

 

Account 객체 반환

@Transactional
    public void processNewAccount(SignUpForm signUpForm) {
        Account newAccount = saveNewAccount(signUpForm);
        newAccount.generateEmailCheckToken(); //UUID
        sendSignUpConfirmEmail(newAccount);
    }

->  Account Return

@Transactional
    public Account processNewAccount(SignUpForm signUpForm) {
        Account newAccount = saveNewAccount(signUpForm);
        newAccount.generateEmailCheckToken(); //UUID
        sendSignUpConfirmEmail(newAccount);
        return newAccount;
    }
    

AccountService에 login method 추가

AccountService {

// private final AuthenticationManager authenticationManager; -> Springsecurity 설정을 바꿔야 사용가능

public void login(Account account) {
        // 첫째값 principal second password, third role
        /*
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                account.getNickname(), account.getPassword(),
                List.of(new SimpleGrantedAuthority("ROLE USER")));
        */
        UsernamePasswordAuthenticationToken token1 = new UsernamePasswordAuthenticationToken(username, password);
        Authentication authentication = authenticationManager.authenticate(token1);
        SecurityContext context = SecurityContextHolder.getContext();   // contextholder가 context를 가짐
        context.setAuthentication(token);
        
        
        UsernamePasswordAuthenticationToken를 username password 평문을 넣어서 token을 생성하고
        SpringSecurity core의 authenticationManager 빈 주입 받아 객체 생성하고
        token을 넣어서 Authentication 객체 생성
        SecurityContextHolder에서 컨텍스트 생성
        컨텍스트에서 토큰 넣은 후 인증이 원래 정석적인 방법
        
    }

public void login(Account account) {
        public void login(Account account) {
        // first principal. second password, third role
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                account.getNickname(), account.getPassword(),
                List.of(new SimpleGrantedAuthority("ROLE USER")));
        SecurityContextHolder.getContext().setAuthentication(token);
        //그냥 권한 다 넣어버려서 로그인 시켜버리기
        // 이렇게 하는 이유는 plain password의 사용을 자제하고 있어
        // encoding한 password는 접근을 못하기 때문
    }
}



}

 

mockMvc - SpringSecurity

.with(csrf())

.andExpect(authenticated)

.andExpect(unauthenticated)

등등

 

 

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

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