728x90
스프링 시큐리티를 사용해 프로젝트를 진행하던 중 카카오로 로그인 요청을 했을 때 회원가입이 안되어있으면 회원 가입을 하고 아니면 바로 로그인이 되는 기능을 구현하였다.
@GetMapping("/auth/kakao/callback")
public String kakaoCallBack(String code, HttpServletRequest request) throws ParseException {
String username = loginService.requestKakaoToken(code);
loginService.forcedLogin(username, request);
return "redirect:/";
}
먼저 카카오 콜백 메소드이다. 유저네임 = 이메일을 카카오를 통해 전달받는다. 이 부분을 굳이 보여주지는 않는다.
public void forcedLogin(String username, HttpServletRequest request){
User user = this.userRepository.findByUserName(username);
Authentication authentication = new UsernamePasswordAuthenticationToken(new UserDetail(user), null, Collections.emptyList());
SecurityContext securityContext = SecurityContextHolder.getContext();
securityContext.setAuthentication(authentication);
HttpSession session = request.getSession(true);
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
}
- Authentication authentication = new UsernamePasswordAuthenticationToken(new UserDetail(user), null, Collections.emptyList());
- UsernamePasswordAuthenticationToken 객체를 생성해 인증 정보를 만든다. 여기에 UserDeatil, 비밀번호 그리고 권한이 들어가는데 나는 간단한 토이 프로젝트를 진행할 것이므로 권한이 필요 없어서 만들지 않았다.
- SecurityContext securityContext = SecurityContextHolder.getContext();
securityContext.setAuthentication(authentication);
- SecurityContextHolder에서 현재 SecurityContext를 가져오고, 여기에 새로 생성한 Authentication 객체를 강제 주입한다.
- HttpSession session = request.getSession(true)
- HTTP 세션을 가져와 SPRING_SECURITY_CONTEXT라는 이름의 속성에 SecurityContext를 저장한다.
우리는 이 그림에서 가장 마지막 10번에 SecurityContextHolder에 있는 SecurityContext를 가져와 그 안에다가 직접 Authentication을 넣어주는 작업을 했다고 보면 된다. 그리고 저 Authentication을 2번의 UsernamePassAuthenticationToken을 사용해 User정보로 UserDetatil을 생성하여 만들어 삽입해주었다.
즉, 원래 로그인을 시도하면 만들어지는 작업을 직접해주었다고 보면 된다.
'Dev > Spring Boot' 카테고리의 다른 글
[Spring Security] 스프링시큐리티의 기본 로그인을 사용하지 못했던 문제 (0) | 2024.10.27 |
---|---|
[JPA] 인덱싱을 통한 SELECT 성능 향상 (0) | 2024.10.22 |
Java로 문자열 xml 파일 파싱 (0) | 2024.09.20 |
Spring Boot JPA - BufferedReader로 CSV 파일을 읽어 DB에 저장하기 (1) | 2024.09.20 |
Spring Boot - RestClient 로 공공데이터 얻어오기 (0) | 2024.08.20 |