Skip to content

Commit

Permalink
로그인 및 회원가입 초기 구현#8
Browse files Browse the repository at this point in the history
  • Loading branch information
jayrhie committed Jan 19, 2023
1 parent d951134 commit 6d3dcc9
Show file tree
Hide file tree
Showing 12 changed files with 22 additions and 44 deletions.
Binary file removed BE/.DS_Store
Binary file not shown.
Binary file removed BE/src/.DS_Store
Binary file not shown.
Binary file removed BE/src/main/.DS_Store
Binary file not shown.
Binary file removed BE/src/main/java/.DS_Store
Binary file not shown.
Binary file removed BE/src/main/java/Remoa/.DS_Store
Binary file not shown.
Binary file removed BE/src/main/java/Remoa/BE/.DS_Store
Binary file not shown.
Binary file removed BE/src/main/java/Remoa/BE/controller/.DS_Store
Binary file not shown.
29 changes: 13 additions & 16 deletions BE/src/main/java/Remoa/BE/controller/KakaoController.java
Original file line number Diff line number Diff line change
@@ -1,37 +1,34 @@
package Remoa.BE.controller;

import Remoa.BE.service.KakaoService;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Map;

//@RestController로 바꾸어야 합니다.
@Controller
@RestController
@Slf4j
@RequiredArgsConstructor
public class KakaoController {

@Autowired //private final 키워드와 @NoArgsConstructor를 붙여서 생성자 주입으로 바꾸기
KakaoService ks;

//@GetMapping("/do")
//public String loginPage() { return "kakaoCI/login"; }
@Autowired
private final KakaoService ks;

@GetMapping("/signup/kakao")
public String getCI(@RequestParam String code, Model model) throws IOException {
System.out.println("code = " + code); //@Slf4j로 로그 찍는 게 더 가독성이나 기능면에서 좋습니다.
log.info("code = " + code);

// 액세스 토큰과 유저정보 받기
String access_token = ks.getToken(code);
Map<String, Object> userInfo = ks.getUserInfo(access_token);
model.addAttribute("code", code);
model.addAttribute("access_token", access_token);
model.addAttribute("userInfo", userInfo);
//React와 Rest API로 작업하는 환경에서는 Model을 사용하지 않는다고 알고 있습니다.
//그냥 필요한 값을 return시키면 @RestController가 알아서 json으로 맵핑해줍니다.
return "index";

return "redirect:/";
}
}
32 changes: 7 additions & 25 deletions BE/src/main/java/Remoa/BE/controller/LoginController.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,13 @@ public class LoginController {
private final LoginService loginService;

private void securityLoginWithoutLoginForm(HttpServletRequest request, Member member) {

//로그인 세션에 들어갈 권한을 설정합니다.
List<GrantedAuthority> list = new ArrayList<>();
if (member.getRole().equals("ROLE_USER")) {
list.add(new SimpleGrantedAuthority("ROLE_USER"));
log.info("ROLE_USER");
} else if (member.getRole().equals("ROLE_ADMIN")) {
list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
log.info("ROLE_ADMIN");
}
List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
list.add(new SimpleGrantedAuthority("ROLE_USER"));
// Role을 설정하는 부분이 따로 없어서 에러가 났던 것 같습니다
// admin은 저희가 따로 설정할 수 있게 두고 디폴트를 user로 두면 어떨까요?
// 아직 LoginService 파일에서는 고쳐놓지 않았습니다

SecurityContext sc = SecurityContextHolder.getContext();
//아이디, 패스워드, 권한을 설정합니다. 아이디는 Object단위로 넣어도 무방하며
Expand All @@ -48,8 +46,7 @@ private void securityLoginWithoutLoginForm(HttpServletRequest request, Member me
session.setAttribute("loginMember", member);

//위에서 설정한 값을 Spring security에서 사용할 수 있도록 세션에 설정해줍니다.
session.setAttribute(HttpSessionSecurityContextRepository.
SPRING_SECURITY_CONTEXT_KEY, sc);
session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, sc);
}

@GetMapping("/login")
Expand All @@ -70,23 +67,8 @@ public String login(@Valid @RequestBody LoginForm form, HttpServletRequest reque
}
log.info("login process success");

//Spring Security를 통한 로그인을 할 때 기본적으로 form 방식으로 진행하는데, 우리는 Resi API로 json을 주고받으므로
//Spring Security의 로그인 방식을 그대로 쓸 수 없었습니다.
//대신 Spring Security가 관리하는 객체에 강제로 우리가 사용할 권한, 인증 관련 설정과 세션 설정을 강제로 주입하는 방법을 찾았습니다.
//다른 방법들도 많았는데, 필터를 통해 form 데이터를 json으로 바꾸어주는 라이브러리를 쓴다든지하는.. 하지만 너무 복잡하고 적용이 어려웠습니다.
//애초에 Spring Security가 필수 툴이 아니라 AOP를 지키면서 편리하게 로그인을 구현할 수 있게 도와주는 툴이라고 하더라구요.
//그래서 Spring Security의 정석적인 사용법은 아니지만 동작에는 이상이 없는 해당 방법으로 Spring Security의 기능들을 사용하면서
//로그인 기능을 구현했습니다.
securityLoginWithoutLoginForm(request, loginMember);

/*// 세션 설정 추가하기
// 기존
//세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성
HttpSession session = request.getSession();
//세션에 로그인 회원 정보 보관
session.setAttribute("loginMember", loginMember);
//세션 관리자를 통해 세션을 생성하고, 회원 데이터 보관*/
return "login success";
}
}
2 changes: 1 addition & 1 deletion BE/src/main/java/Remoa/BE/service/KakaoService.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
@RequiredArgsConstructor
public class KakaoService {

//카카오 로그인시 접속해야 할 링크 : https://kauth.kakao.com/oauth/authorize?client_id=139febf9e13da4d124d1c1faafcf3f86&redirect_uri=http://localhost:8080/kakao&response_type=code
//카카오 로그인시 접속해야 할 링크 : https://kauth.kakao.com/oauth/authorize?client_id=139febf9e13da4d124d1c1faafcf3f86&redirect_uri=http://localhost:8080/signup/kakao&response_type=code

private final MemberRepository memberRepository;

Expand Down
2 changes: 1 addition & 1 deletion BE/src/main/java/Remoa/BE/service/LoginService.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,4 @@ private void securityLoginWithoutLoginForm(HttpServletRequest request, Member me
session.setAttribute(HttpSessionSecurityContextRepository.
SPRING_SECURITY_CONTEXT_KEY, sc);
}
}// ->LoginController에서 해당 로직을 통해 세션 생성하며 로그인해야 Spring Security를 제대로 사용할 수 있음!
}
1 change: 0 additions & 1 deletion BE/test

This file was deleted.

0 comments on commit 6d3dcc9

Please sign in to comment.