출처
www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1/dashboard
github.com/devjun63/whiteship-studyolle/commit/a03c2a792c01002d66368475f3f7a55b898b8dd1
목표
- 회원 가입 완료 시 자동 로그인
- 이메일 인증 완료시 자동 로그인
스프링 시큐리티 관점에서 로그인
- 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;
'프로젝트 정리 > 스프링과 JPA 기반 웹 애플리케이션 개발' 카테고리의 다른 글
14. 프론트엔드 라이브러리 설정 (0) | 2021.03.05 |
---|---|
13. 회원가입: 메인 네비게이션 메뉴 변경 (0) | 2021.03.04 |
11. 회원 가입: 인증 메일 확인 테스트 및 리팩토링 (0) | 2021.02.25 |
10. 회원 가입: 인증 메일 확인 (0) | 2021.02.24 |
9. 회원 가입: 패스워드 인코더 (0) | 2021.02.24 |