Skip to content

Commit

Permalink
자동 로그인 (#58)
Browse files Browse the repository at this point in the history
* 자동 로그인

* 로그인, 회원가입 초안

* 자동 로그인기능, 로그인 회원가입 화면 초안

* fix : 검증문제 해결

* 회원가입시 패스워드 수정

* 자동로그인 화면 수정

* 자동로그인 수정

* 자동 로그인 수정2

* 자동 로그인 수정3

* feat : Exception 추가

* checkout을 위한 Commit

* 사용자 수정

* 로그인 화면 수정

* 사용자 수정2

* 로그인 화면 수정

* 사용자 수정2

* feat : 입찰기능 추가 (#71)

* refactor, feat : 컬럼 추가, 타입변경 및 rename 에 따른 기능 수정

* feat : Scheduling완료, Mail Template 페이지제작

* tempSave

* feat : 입찰 기능 구현

* feat : checkout을 위한 Commit

* feat : Emial Template 제작중

* feat : 이메일 구현
- 입찰자가 없는 경우 유찰 안내메일
- 관리자가 승인하지 않은 경우 유찰 안내메일
- 경매 시작 안내 메일
- 링크 발송을 위한 Properties 추가

* Issue 수정

* feat : detail페이지 이쁘게 꾸미기

* faet : Front로직 추가~

* Feat : 입찰기능 추가

* 사용자 수정3

* merge

---------

Co-authored-by: donsonioc2010 <whddnjs822@gmail.com>
Co-authored-by: Jong1 <44349716+donsonioc2010@users.noreply.github.com>
  • Loading branch information
3 people authored Sep 26, 2023
1 parent ad64a4c commit ec9d54a
Show file tree
Hide file tree
Showing 13 changed files with 372 additions and 139 deletions.
176 changes: 113 additions & 63 deletions Api/src/main/java/picasso/server/api/user/controller/AuthController.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package picasso.server.api.user.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -27,72 +29,120 @@
@RequiredArgsConstructor
public class AuthController {

private final UserService userService;
private final UserService userService;

/**
* 로그인 폼으로 이동
*
* @return
*/
@GetMapping("/login")
public String showLoginForm(HttpSession session) {
// TODO : 페이지 들어올때 자동로그인 설정 된 경우 Cookie 받아서 처리하는 로직 추가하기
return "auth/login";
}
/**
* 로그인 폼으로 이동
*
* @return
*/
// @GetMapping("/login")
// public String showLoginForm(HttpSession session) {
// // TODO : 페이지 들어올때 자동로그인 설정 된 경우 Cookie 받아서 처리하는 로직 추가하기
// return "auth/login";
// }
@GetMapping("/login")
public String showLoginForm(HttpSession session, HttpServletRequest request) {
//쿠키를 확인하여 자동 로그인 처리
Cookie[] cookies = request.getCookies();
String userId = null;
String email = null;

/**
* 로그인 기능 구현
*
* @param requestDto
* @param session
* @return
* @throws JsonProcessingException
*/
@PostMapping("/login")
public String handleLogin(LoginRequestDto requestDto, HttpSession session) throws JsonProcessingException {
session.removeAttribute("loginUser");
Optional<User> findResult = userService.login(requestDto);
findResult.ifPresent(user -> setSessionLoginUser(session, user));
if (findResult.isEmpty())
return "redirect:/auth/login";
return "redirect:/";
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userId")) {
userId = cookie.getValue();
} else if (cookie.getName().equals("email")) {
email = cookie.getValue();
}
}
}
if (userId != null && email != null) {
Optional<User> findResult = userService.findUserByIdAndEmail(Long.parseLong(userId), email);
findResult.ifPresent(user -> {
setSessionLoginUser(session, user);
});
if (findResult.isPresent()) {
return "redirect:/"; // 성공적으로 사용자를 찾으면 메인 페이지로 리다이렉트
}
}
return "auth/login";
}


/**
* 회원가입 폼으로 이동
*
* @return
*/
@GetMapping("/signup")
public String showSignUpForm() {
return "auth/signup-form";
}
/*
* 로그인 기능 구현
*
* @param requestDto
* @param session
* @return
* @throws JsonProcessingException
*/

/**
* 회원가입 처리 로직
*
* @param requestDto
* @return
*/
@PostMapping("/signup")
public String signUp(SignUpRequestDto requestDto, HttpSession session) {
setSessionLoginUser(session, userService.signUp(requestDto));
return "redirect:/";
}
private void setSessionLoginUser(HttpSession session, User user) {
session.setAttribute("loginUser", user);
}

@ResponseBody
@PostMapping("/session-info")
public Map<String, Long> paymentSessionInfoRtn(HttpSession session) {
User temp = (User)session.getAttribute("loginUser");
Long userId = userService.findUserById(temp.getId()).orElseThrow(
() -> UserNotFoundException.EXCEPTION
).getId();
return new HashMap<String, Long>(){{
put("userId", userId);
}};
}
@PostMapping("/login")
public String handleLogin(LoginRequestDto requestDto, HttpSession session, HttpServletResponse response) {
session.removeAttribute("loginUser");
Optional<User> findResult = userService.login(requestDto);
findResult.ifPresent(user -> {
setSessionLoginUser(session, user);
// 자동 로그인 쿠키 생성
// TODO : Email 쿠키 ㅇㄷ?, ACTIVE가 아니면 로그인 안되게 처리하는 로직 ㅇㄷ?
if (requestDto.isRememberMe()) {
Cookie cookie1 = new Cookie("userId", user.getId().toString());
Cookie cookie2 = new Cookie("email", user.getEmail());
cookie1.setMaxAge(60 * 60 * 24 * 365);
cookie2.setMaxAge(60 * 60 * 24 * 365);
response.addCookie(cookie1);
response.addCookie(cookie2);
}
});
if (findResult.isEmpty())
return "redirect:/auth/login";
return "redirect:/";
}


@GetMapping("/logout")
public String showLogoutForm(HttpSession session) {
session.removeAttribute("loginUser");
// 로그아웃 폼 페이지를 보여줍니다.
return "redirect:/";
}

/**
* 회원가입 폼으로 이동
*
* @return
*/
@GetMapping("/signup")
public String showSignUpForm() {
return "auth/signup-form";
}

/**
* 회원가입 처리 로직
*
* @param requestDto
* @return
*/
@PostMapping("/signup")
public String signUp(SignUpRequestDto requestDto, HttpSession session) {
setSessionLoginUser(session, userService.signUp(requestDto));
return "redirect:/";
}
private void setSessionLoginUser(HttpSession session, User user) {
session.setAttribute("loginUser", user);
}

@ResponseBody
@PostMapping("/session-info")
public Map<String, Long> paymentSessionInfoRtn(HttpSession session) {
User temp = (User)session.getAttribute("loginUser");
Long userId = userService.findUserById(temp.getId()).orElseThrow(
() -> UserNotFoundException.EXCEPTION
).getId();
return new HashMap<String, Long>(){{
put("userId", userId);
}};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package picasso.server.api.user.exception;

import picasso.server.common.exception.BaseException;

import static picasso.server.common.exception.GlobalException.EMAIL_ERROR;

public class EmailErrorException extends BaseException {
public static final BaseException EXCEPTION = new EmailErrorException();

public EmailErrorException() { super(EMAIL_ERROR);}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package picasso.server.api.user.exception;

import picasso.server.common.exception.BaseException;

import static picasso.server.common.exception.GlobalException.LOGIN_ERROR;

public class LoginErrorException extends BaseException {
public static final BaseException EXCEPTION = new LoginErrorException();

public LoginErrorException() {
super(LOGIN_ERROR);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package picasso.server.api.user.exception;

import picasso.server.common.exception.BaseException;

import static picasso.server.common.exception.GlobalException.STATUS_ERROR;

public class StatusErrorException extends BaseException {
public static final BaseException EXCEPTION = new StatusErrorException();

public StatusErrorException() { super(STATUS_ERROR); }
}
42 changes: 18 additions & 24 deletions Api/src/main/java/picasso/server/api/user/service/UserService.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package picasso.server.api.user.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import picasso.server.api.user.exception.EmailErrorException;
import picasso.server.api.user.vo.request.LoginRequestDto;
import picasso.server.api.user.vo.request.SignUpRequestDto;
import picasso.server.domain.domains.user.dto.UserDTO;
import picasso.server.domain.domains.user.entity.User;
import picasso.server.domain.domains.user.repository.UserRepository;

Expand All @@ -22,9 +18,15 @@
public class UserService {

private final UserRepository userRepository;
private final ObjectMapper objectMapper;

public User signUp(SignUpRequestDto userDto) {

Optional<User> existingUser = userRepository.findByEmail(userDto.getEmail());
if (existingUser.isPresent()) {
// TODO : Custom Exception ㅇㄷ?
throw EmailErrorException.EXCEPTION; // 중복 이메일 체크
}

return userRepository.save(User.builder()
.email(userDto.getEmail())
.password(userDto.getPassword())
Expand All @@ -38,24 +40,6 @@ public Optional<User> login(LoginRequestDto userDto) {
return findUser;
}

public boolean isUserValid(UserDTO userDto, HttpServletRequest request) throws JsonProcessingException {
// 1. 쿠키에서 "user" 데이터를 가져옵니다.
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("user".equals(cookie.getName())) {
// 2. 가져온 데이터를 User 객체로 변환합니다.
User userFromCookie = objectMapper.readValue(cookie.getValue(), User.class);

// 3. 변환된 User 객체와 입력받은 UserDTO 데이터를 비교합니다.
if (userDto.getEmail().equals(userFromCookie.getEmail()) && userDto.getPassword().equals(userFromCookie.getPassword())) {
return true; // 쿠키의 데이터와 입력된 데이터가 일치합니다.
}
}
}
}
return false; // 일치하는 쿠키 데이터가 없거나, 데이터가 입력과 일치하지 않습니다.
}


public Optional<User> findUserByEmailAndPassword(String email, String password) {
Expand All @@ -66,13 +50,23 @@ public Optional<User> findUserByNickname(String nickname) {
return userRepository.findByNickName(nickname);
}


public void deleteUserById(Long id) {
userRepository.deleteById(id);
}
public Optional<User> findUserById(Long id) {
return userRepository.findById(id);
}

//??
public Optional<User> findUserByIdAndEmail(Long userId, String email) {
return userRepository.findByIdAndEmail(userId, email);
}

public Optional<User> findUserByEmail(String email) {
return userRepository.findByEmail(email);
}

public Optional<User> findById(Long userId) {
return userRepository.findById(userId);
}
Expand Down
33 changes: 33 additions & 0 deletions Api/src/main/resources/static/css/login.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#login-box {
margin: 80px;
background-color: white;
display: flex;
flex-direction: column;
border-radius: 70px;
justify-content: center;
align-items: center;
height: 50vh;
margin-left: 37%;
border: 10px solid #18ACDB;
width: 380px;
}

#login-title {
text-align: center;
font-family: Sigmar One;
font-style: normal;
color: #18ACDB;
}

#email, #password {
text-align: center;
}

#rememberMe-container {
text-align: center;
}

.btn-primary.before-login-btn {
text-align: center;
margin-left: 28%;
}
41 changes: 41 additions & 0 deletions Api/src/main/resources/static/css/signup.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
signup-container {
margin: 80px;
background-color: white;
display: flex;
flex-direction: column;
border-radius: 70px;
justify-content: center;
align-items: center;
height: 50vh;
margin-left: 37%;
border: 10px solid #18ACDB;
width: 380px;
}

signup-form {
/* form 관련 스타일 추가 */
}

signup-title {
text-align: center;
font-family: Sigmar One;
font-style: normal;
color: #18ACDB;
}

signup-table {
/* table 관련 스타일 추가 */
}

#nickname,
#email,
#password,
#repeatPassword {
background-color: #E8F0FE;
text-align: center;
}

register-button {
text-align: center;
margin-left: 20%;
}
Loading

0 comments on commit ec9d54a

Please sign in to comment.