목표
- 회원 가입 완료시 자동 로그인
- 이메일 인증 완료시 자동 로그인
스프링 시큐리티 관점에서 로그인
- 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 기반 웹 어플리케이션 개발 > 1부 (개발환경, 회원가입, 로그인, 계정설정)' 카테고리의 다른 글
12. 프론트엔드 라이브러리 설정 (0) | 2020.04.19 |
---|---|
11. 회원 가입: 메인 네비게이션 메뉴 변경 (0) | 2020.04.19 |
09. 회원 가입: 인증 메일 확인 테스트 및 리팩토링 (0) | 2020.04.18 |
08. 회원 가입: 인증 메일 확인 (0) | 2020.04.18 |
07. 회원 가입: 패스워드 인코더 (0) | 2020.04.18 |