Skip to content

Commit

Permalink
refact:패키지 구조 변경 및 user 관련 테스트 코드 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
byunyourim committed Sep 7, 2024
1 parent 315b978 commit 43d3f06
Show file tree
Hide file tree
Showing 17 changed files with 150 additions and 135 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/kboticket/common/constants/KboConstant.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
@UtilityClass
public class KboConstant {
public static final String SEAT_LOCK = "seatLock:";
public static final String ACCESS_LOCK = "access";
public static final String REFRESH_LOCK = "refresh";

public static final String BASIC_DLIIMITER = ":";
public static final String AUTH_HEADER_PREFIX = "Basic ";
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/com/kboticket/common/util/PasswordUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.kboticket.common.util;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

public class PasswordUtils {

static BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();

public static String encrypt(String rawPassword) {
return bCryptPasswordEncoder.encode(rawPassword);
}

public static String validate(String rawPassword) {
// 정규식 추가
return rawPassword;
}

public static Boolean matches(String rawPassword, String encodedPassword) {
return bCryptPasswordEncoder.matches(rawPassword, encodedPassword);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kboticket.util;
package com.kboticket.common.util;

import com.kboticket.domain.Seat;
import com.kboticket.domain.Stadium;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kboticket.util.coolSms;
package com.kboticket.common.util.coolSms;

public class SmsTemplate {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import com.kboticket.dto.seat.SeatDto;
import com.kboticket.enums.StadiumInfo;
import com.kboticket.service.seat.SeatService;
import com.kboticket.util.SeatArrangement;
import com.kboticket.common.util.SeatArrangement;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public void signup(@RequestBody SignupRequest request) {
*/
@PostMapping("/reissued")
public CommonResponse<TokenDto> reissued(HttpServletRequest request) throws Exception {
TokenDto tokenDto = userService.reissue(request);
TokenDto tokenDto = userService.reissueToken(request);

return new CommonResponse(tokenDto);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.kboticket.controller.user;

import com.kboticket.common.CommonResponse;
import com.kboticket.common.util.PasswordUtils;
import com.kboticket.controller.user.dto.ChangePasswordRequest;
import com.kboticket.controller.user.dto.UpdateUserRequest;
import com.kboticket.dto.user.UserDto;
Expand Down Expand Up @@ -45,8 +46,9 @@ public CommonResponse<UserDto> getUserInfo(Authentication authentication) {
@ResponseStatus(HttpStatus.OK)
public void verifyPassword(Authentication authentication,
@RequestBody String password) {

String email = authentication.getName();
boolean isPasswordValid = userService.checkPassword(email, password);
boolean isPasswordValid = userService.verifyPassword(email, password);

if (!isPasswordValid) {
throw new KboTicketException(ErrorCode.INCORRECT_PASSWORD);
Expand Down
7 changes: 0 additions & 7 deletions src/main/java/com/kboticket/dto/login/LoginDto.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.kboticket.dto.login;


import com.kboticket.controller.login.dto.LoginRequest;
import lombok.*;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Builder
@Getter @Setter
Expand All @@ -19,9 +17,4 @@ public static LoginDto from(LoginRequest request) {
.password(request.getPassword())
.build();
}

// public void passwordEncryption(BCryptPasswordEncoder bCryptPasswordEncoder){
// this.password = bCryptPasswordEncoder.encode(password);
// }

}
2 changes: 1 addition & 1 deletion src/main/java/com/kboticket/enums/ErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public enum ErrorCode {
PHONE_NOT_FOUND(10009, "Phone not found", HttpStatus.NOT_FOUND),
EMAIL_NOT_FOUND(10010, "Email not found", HttpStatus.NOT_FOUND),
PASSWORD_NOT_FOUND(10011, "Password not found", HttpStatus.NOT_FOUND),
PASSWORD_MISMATCH(10012, "Password and confirmpassword mismatch", HttpStatus.BAD_REQUEST),
PASSWORD_MISMATCH(10012, "Password and ConfirmPassword mismatch", HttpStatus.BAD_REQUEST),
GENERATE_TEMP_PW_ERR(10013, "Generate temp Password Failed", HttpStatus.CONFLICT),
INCORRECT_PASSWORD(10014, "The password is incorrect", HttpStatus.NOT_FOUND),
INVALID_AUTHORIZATION(10015, "Invalid or missing Authorization", HttpStatus.BAD_REQUEST),
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/com/kboticket/service/ReservationService.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package com.kboticket.service;

import com.esotericsoftware.minlog.Log;
import com.kboticket.common.constants.KboConstant;
import com.kboticket.dto.ReservedSeatInfo;
import com.kboticket.enums.ErrorCode;
import com.kboticket.enums.ReservationStatus;
import com.kboticket.exception.KboTicketException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.*;
import org.slf4j.LoggerFactory;
import org.redisson.api.RBucket;
import org.redisson.api.RKeys;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -19,7 +20,6 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;


@Slf4j
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/kboticket/service/SmsSenderService.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import com.kboticket.exception.KboTicketException;
import com.kboticket.repository.SmsCertification;
import com.kboticket.repository.UserRepository;
import com.kboticket.util.coolSms.SmsTemplate;
import com.kboticket.common.util.coolSms.SmsTemplate;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
Expand Down
24 changes: 17 additions & 7 deletions src/main/java/com/kboticket/service/login/LoginService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.kboticket.service.login;

import com.kboticket.common.constants.KboConstant;
import com.kboticket.common.util.PasswordUtils;
import com.kboticket.config.jwt.JwtTokenProvider;
import com.kboticket.domain.User;
import com.kboticket.dto.login.LoginDto;
import com.kboticket.enums.ErrorCode;
import com.kboticket.enums.TokenType;
Expand Down Expand Up @@ -29,27 +32,34 @@ public void login(LoginDto loginDto) {
String email = loginDto.getUsername();
String password = loginDto.getPassword();

// 이메일로 존재하는 유저인지 확인
userService.isExistEmail(email);
User user = userService.getUserByEmail(email);

// 비밀번호 일치 확인
if (!userService.checkPassword(email, password)) {
if (PasswordUtils.matches(password, user.getPassword())) {
throw new KboTicketException(ErrorCode.INCORRECT_PASSWORD);
}

// 토큰 생성
String accessKey = KboConstant.ACCESS_LOCK + KboConstant.BASIC_DLIIMITER + email;
String refreshKey = KboConstant.REFRESH_LOCK + KboConstant.BASIC_DLIIMITER + email;

invalidatePreviousToken(accessKey, refreshKey);

String accessToken = jwtTokenProvider.generateToken(email, TokenType.ACCESS);
String refreshToken = jwtTokenProvider.generateToken(email, TokenType.REFRESH);

log.info(accessToken);
log.info(refreshToken);

saveToken("access:" + email, accessToken, 6 * 60 * 60 * 1000L, TimeUnit.MILLISECONDS);
saveToken("refresh:" + email, refreshToken, 7, TimeUnit.DAYS);
saveToken(accessKey, accessToken, 6 * 60 * 60 * 1000L, TimeUnit.MILLISECONDS);
saveToken(refreshKey, refreshToken, 7, TimeUnit.DAYS);

}

private void saveToken(String key, String token, long timeout, TimeUnit timeUnit) {
redisTemplate.opsForValue().set(key, token, timeout, timeUnit);
}

private void invalidatePreviousToken(String accessKey, String refreshKey) {
redisTemplate.delete(accessKey);
redisTemplate.delete(refreshKey);
}
}
72 changes: 33 additions & 39 deletions src/main/java/com/kboticket/service/user/UserService.java
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
package com.kboticket.service.user;

import com.kboticket.common.util.PasswordUtils;
import com.kboticket.config.jwt.JwtTokenProvider;
import com.kboticket.controller.user.dto.SignupRequest;
import com.kboticket.domain.*;
import com.kboticket.dto.TokenDto;
import com.kboticket.dto.user.UserDto;
import com.kboticket.dto.user.UserInfoDto;
import com.kboticket.dto.user.UserPasswordDto;
import com.kboticket.controller.user.dto.SignupRequest;
import com.kboticket.enums.ErrorCode;
import com.kboticket.exception.*;
import com.kboticket.repository.terms.TermsRepository;
import com.kboticket.exception.KboTicketException;
import com.kboticket.repository.UserRepository;
import com.kboticket.repository.terms.TermsRepository;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Slf4j
Expand All @@ -30,9 +29,7 @@ public class UserService {

private final UserRepository userRepository;
private final TermsRepository termsRepository;

private final JwtTokenProvider jwtTokenProvider;
private final BCryptPasswordEncoder bCryptPasswordEncoder;

@Transactional
public void signup(SignupRequest request) {
Expand All @@ -59,7 +56,7 @@ public void signup(SignupRequest request) {

User user = User.builder()
.email(email)
.password(bCryptPasswordEncoder.encode(password))
.password(PasswordUtils.encrypt(password))
.phone(phone)
.build();

Expand All @@ -77,32 +74,18 @@ public void signup(SignupRequest request) {
userRepository.save(user);
}

public TokenDto reissue(HttpServletRequest request) throws Exception {
public boolean verifyPassword(String email, String inputPassword) {
String endcodePassword = getUserByEmail(email).getPassword();
return PasswordUtils.matches(inputPassword, endcodePassword);
}

public TokenDto reissueToken(HttpServletRequest request) throws Exception {
String refreshToken = jwtTokenProvider.resolveToken(request.getHeader("Authorization"));
String newAccessToken = jwtTokenProvider.reissueAccessToken(refreshToken);

return new TokenDto(newAccessToken, refreshToken);
}

public User findById(Long userId) {
return userRepository.findById(userId)
.orElseThrow(() -> new KboTicketException(ErrorCode.NOT_FOUND_USER));
}

public UserDto getUserDto(String email) {
User user = getUserByEmail(email);

return UserDto.builder()
.email(user.getEmail())
.phone(user.getPhone())
.build();
}

public User getUserByEmail(String email) {
return userRepository.findByEmail(email)
.orElseThrow(() -> new KboTicketException(ErrorCode.NOT_FOUND_USER));
}

// user 정보 변경
public void updateUserInfo(String email, UserInfoDto userInfoDto) {
User user = getUserByEmail(email);
Expand All @@ -126,19 +109,38 @@ public void updatePassword(UserPasswordDto userPasswordDto) {

User user = getUserByEmail(email);

// 기존 비밀 번호 확인
if (!checkPassword(email, currentPassword)) {
if (!PasswordUtils.matches(currentPassword, user.getPassword())) {
throw new KboTicketException(ErrorCode.INCORRECT_PASSWORD);
}

// newPassword, confirmPassword 일치 여부 확인
if (!newPassword.equals(confirmPassword)) {
throw new KboTicketException(ErrorCode.PASSWORD_MISMATCH);
}

user.setPassword(bCryptPasswordEncoder.encode(newPassword));
user.setPassword(PasswordUtils.encrypt(newPassword));
userRepository.save(user);
}

public User findById(Long userId) {
return userRepository.findById(userId)
.orElseThrow(() -> new KboTicketException(ErrorCode.NOT_FOUND_USER));
}

public UserDto getUserDto(String email) {
User user = getUserByEmail(email);

return UserDto.builder()
.email(user.getEmail())
.phone(user.getPhone())
.build();
}

public User getUserByEmail(String email) {
return userRepository.findByEmail(email)
.orElseThrow(() -> new KboTicketException(ErrorCode.NOT_FOUND_USER));
}

// email 존재 여부
public boolean isExistEmail(String email) {
return userRepository.existsByEmail(email);
Expand All @@ -155,12 +157,4 @@ public String findbyPhone(String phone) {
.orElseThrow(() -> new KboTicketException(ErrorCode.NOT_FOUND_USER));
return user.getEmail();
}

// 기존 비밀 번호 확인
public boolean checkPassword(String email, String inputPassword) {
Optional<User> optionalUser = userRepository.findByEmail(email);
String storedPassword = optionalUser.get().getPassword();

return bCryptPasswordEncoder.matches(inputPassword, storedPassword);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ void reissuedSuccessTest() throws Exception {
HttpServletRequest request = new MockHttpServletRequest();
TokenDto tokenDto = new TokenDto("newAccessToken", "refreshToken");

given(userService.reissue(request)).willReturn(tokenDto);
given(userService.reissueToken(request)).willReturn(tokenDto);

// when & then
mockMvc.perform(post("/api/user/reissued")
Expand All @@ -142,7 +142,7 @@ void reissuedFailureTest() throws Exception {

willThrow(new KboTicketException(ErrorCode.FAILED_GENERATE_TOKEN))
.given(userService)
.reissue(any());
.reissueToken(any());

// when & then
mockMvc.perform(post("/api/user/reissued")
Expand Down
10 changes: 5 additions & 5 deletions src/test/java/com/kboticket/controller/UserControllerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ void setUp() {
}

@Test
@DisplayName("[SUCCESS] 비밀번호 일치여부 테스트")
@DisplayName("[SUCCESS] Password 일치 여부")
void verifyPasswordSuccessTest() throws Exception {
// given
String email = "[email protected]";
String password = "1111";

given(authentication.getName()).willReturn(email);
given(userService.checkPassword(anyString(), anyString())).willReturn(false);
given(userService.verifyPassword(anyString(), anyString())).willReturn(true);

// when & then
mockMvc.perform(post("/users/verify-password")
Expand All @@ -60,11 +60,11 @@ void verifyPasswordSuccessTest() throws Exception {
.andDo(result -> System.out.println("Response status: " + result.getResponse().getStatus()))
.andExpect(status().isOk());

verify(userService).checkPassword(email, password);
verify(userService).verifyPassword(email, password);
}

@Test
@DisplayName("[FAIL] 비밀번호 일치여부 테스트")
@DisplayName("[FAIL] 비밀번호 일치 여부 테스트")
void verifyPasswordFailTest() throws Exception {
// given
String email = "[email protected]";
Expand All @@ -81,7 +81,7 @@ void verifyPasswordFailTest() throws Exception {
.andDo(result -> System.out.println("Response status: " + result.getResponse().getStatus()))
.andExpect(status().isOk());

verify(userService).checkPassword(email, password);
verify(userService).verifyPassword(email, password);
}

@Test
Expand Down
Loading

0 comments on commit 43d3f06

Please sign in to comment.