From 461a27cc9c8d2a5d6ee442e9ef583222cb75f470 Mon Sep 17 00:00:00 2001 From: Geonhee Min Date: Mon, 3 Nov 2025 02:21:09 +0000 Subject: [PATCH] =?UTF-8?q?issue=20#=20validator,=20converter=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduler/config/SecurityConfig.java | 2 +- .../repository/user/UserRepository.java | 10 +++- .../utils/converter/PasswordConverter.java | 21 +++++++++ .../utils/generator/PasswordGenerator.java | 46 +++++++++++++++++++ .../utils/validation/BaseValidation.java | 15 ++++++ .../utils/validation/UserValidation.java | 32 +++++++------ 6 files changed, 110 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/baekyangdan/scheduler/utils/converter/PasswordConverter.java create mode 100644 src/main/java/com/baekyangdan/scheduler/utils/generator/PasswordGenerator.java create mode 100644 src/main/java/com/baekyangdan/scheduler/utils/validation/BaseValidation.java diff --git a/src/main/java/com/baekyangdan/scheduler/config/SecurityConfig.java b/src/main/java/com/baekyangdan/scheduler/config/SecurityConfig.java index 1857307..92034b6 100644 --- a/src/main/java/com/baekyangdan/scheduler/config/SecurityConfig.java +++ b/src/main/java/com/baekyangdan/scheduler/config/SecurityConfig.java @@ -10,6 +10,6 @@ public class SecurityConfig { @Bean public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); + return new BCryptPasswordEncoder(10); } } diff --git a/src/main/java/com/baekyangdan/scheduler/repository/user/UserRepository.java b/src/main/java/com/baekyangdan/scheduler/repository/user/UserRepository.java index 0f1ec3a..2dbfaff 100644 --- a/src/main/java/com/baekyangdan/scheduler/repository/user/UserRepository.java +++ b/src/main/java/com/baekyangdan/scheduler/repository/user/UserRepository.java @@ -4,12 +4,20 @@ package com.baekyangdan.scheduler.repository.user; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.query.Param; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import com.baekyangdan.scheduler.entity.user.UserEntity; @Repository public interface UserRepository extends JpaRepository { Optional findByEmail(String email); - Optional findById(String id); + + @Transactional + @Modifying(clearAutomatically = true) + @Query("UPDATE UserEntity u SET u.password = :password WHERE u.email = :email") + int resetPasswordByEmail(@Param("password") String newPassword, @Param("email") String email); } diff --git a/src/main/java/com/baekyangdan/scheduler/utils/converter/PasswordConverter.java b/src/main/java/com/baekyangdan/scheduler/utils/converter/PasswordConverter.java new file mode 100644 index 0000000..28636ed --- /dev/null +++ b/src/main/java/com/baekyangdan/scheduler/utils/converter/PasswordConverter.java @@ -0,0 +1,21 @@ +package com.baekyangdan.scheduler.utils.converter; + +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +@Component +public class PasswordConverter { + private final PasswordEncoder passwordEncoder; + + public PasswordConverter(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + public String encode(String rawPassword) { + return passwordEncoder.encode(rawPassword); + } + + public boolean matches(String rawPassword, String encodedPassword) { + return passwordEncoder.matches(rawPassword, encodedPassword); + } +} \ No newline at end of file diff --git a/src/main/java/com/baekyangdan/scheduler/utils/generator/PasswordGenerator.java b/src/main/java/com/baekyangdan/scheduler/utils/generator/PasswordGenerator.java new file mode 100644 index 0000000..2b31f25 --- /dev/null +++ b/src/main/java/com/baekyangdan/scheduler/utils/generator/PasswordGenerator.java @@ -0,0 +1,46 @@ +package com.baekyangdan.scheduler.utils.generator; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PasswordGenerator { + private static final String DIGITS = "0123456789"; + private static final String LOWER = "abcdefghijklmnopqrstuvwxyz"; + private static final String UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final String SPECIAL="!@#$"; + + private static final String ALL = DIGITS + LOWER + UPPER + SPECIAL; + private static final SecureRandom random = new SecureRandom(); + + public static String generateRandomPassword() { + int length = 10; + + List passwordCharacters = new ArrayList<>(length); + + passwordCharacters.add(randomCharFrom(DIGITS)); + passwordCharacters.add(randomCharFrom(LOWER)); + passwordCharacters.add(randomCharFrom(UPPER)); + passwordCharacters.add(randomCharFrom(SPECIAL)); + + for (int i = 4; i < length; i++) { + passwordCharacters.add(randomCharFrom(ALL)); + } + + Collections.shuffle(passwordCharacters, random); + + StringBuilder sb = new StringBulilder(length); + + for (char c : passwordCharacters) { + sb.append(c); + } + + return sb.toString(); + } + + private static char randomCharFrom(String s) { + int idx = random.nextInt(s.length()); + return s.charAt(idx); + } +} \ No newline at end of file diff --git a/src/main/java/com/baekyangdan/scheduler/utils/validation/BaseValidation.java b/src/main/java/com/baekyangdan/scheduler/utils/validation/BaseValidation.java new file mode 100644 index 0000000..f4cd567 --- /dev/null +++ b/src/main/java/com/baekyangdan/scheduler/utils/validation/BaseValidation.java @@ -0,0 +1,15 @@ +package com.baekyangdan.scheduler.utils.validation; + +public class BaseValidation { + private String emailRegExp = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{1,}$" + + protected static boolean validateStringEmpty(String value) { + if (value == null) { + return true; + } + if (value.trim().isEmpty()) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/baekyangdan/scheduler/utils/validation/UserValidation.java b/src/main/java/com/baekyangdan/scheduler/utils/validation/UserValidation.java index 8b7fa4a..0e7fb46 100644 --- a/src/main/java/com/baekyangdan/scheduler/utils/validation/UserValidation.java +++ b/src/main/java/com/baekyangdan/scheduler/utils/validation/UserValidation.java @@ -5,29 +5,33 @@ import org.springframework.security.access.method.P; import com.baekyangdan.scheduler.code.user.SignUpValidationCode; import com.baekyangdan.scheduler.repository.user.UserRepository; import com.baekyangdan.scheduler.request.user.UserRequest; +import com.baekyangdan.scheduler.utils.validation.BaseValidation; -public class UserValidation { +public class UserValidation extends BaseValidation { public static boolean validateSignUpForm(UserRequest.SignUp data) throws Exception { if (validateStringEmpty(data.getId())) { throw new Exception(SignUpValidationCode.ID_EMPTY.getMessage()); } - if (data.getEmail() == null || data.getEmail().trim().isEmpty()) { - + + if (validateStringEmpty(data.getEmail())) { + throw new Exception(SignUpValidationCode.EMAIL_EMPTY.getMessage()); } + + if (validationStringEmpty(data.getPassword())) { + throw new Exception(SignUpValidationCode.PASSWORD_EMPTY.getMessage()); + } + + if (validationStringEmpty(data.getName())) { + throw new Exception(SignUpValidationCode.NAME_EMPTY.getMessage()); + } + + if (validationStringEmpty(data.getNickname())) { + throw new Exception(SignUpValidationCode.NICKNAME_EMPTY.getMessage()); + } + return true; } - private static boolean validateStringEmpty(String value) { - if (value == null) { - return true; - } - - if (value.trim().isEmpty()) { - return true; - } - - return false; - } }