Skip to content

Commit 289cd89

Browse files
authored
feat: 비밀번호 정책 추가 (#435)
* feat: 비밀번호 검증 추가 - 비밀번호는 영문, 숫자, 특수문자를 포함한 8자리 이상 * test: 비밀번호 검증 테스트 추가 * refactor: 이메일 검증 조건 추가 - @notblank와 @Email을 함께 사용하도록 * style: 개행 제거
1 parent d5a9f49 commit 289cd89

File tree

5 files changed

+86
-1
lines changed

5 files changed

+86
-1
lines changed

src/main/java/com/example/solidconnection/auth/dto/EmailSignInRequest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.example.solidconnection.auth.dto;
22

3+
import com.example.solidconnection.auth.dto.validation.Password;
4+
import jakarta.validation.constraints.Email;
35
import jakarta.validation.constraints.NotBlank;
46

57
public record EmailSignInRequest(
68

79
@NotBlank(message = "이메일을 입력해주세요.")
10+
@Email(message = "유효한 이메일 주소를 입력해주세요.")
811
String email,
912

13+
@Password
1014
@NotBlank(message = "비밀번호를 입력해주세요.")
1115
String password
1216
) {

src/main/java/com/example/solidconnection/auth/dto/EmailSignUpTokenRequest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.example.solidconnection.auth.dto;
22

3+
import com.example.solidconnection.auth.dto.validation.Password;
34
import jakarta.validation.constraints.Email;
45
import jakarta.validation.constraints.NotBlank;
56

67
public record EmailSignUpTokenRequest(
78

8-
@Email(message = "이메일을 입력해주세요.")
9+
@NotBlank(message = "이메일을 입력해주세요.")
10+
@Email(message = "유효한 이메일 주소를 입력해주세요.")
911
String email,
1012

13+
@Password
1114
@NotBlank(message = "비밀번호를 입력해주세요.")
1215
String password
1316
) {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.example.solidconnection.auth.dto.validation;
2+
3+
import jakarta.validation.Constraint;
4+
import jakarta.validation.Payload;
5+
import java.lang.annotation.ElementType;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
@Target({ElementType.FIELD, ElementType.RECORD_COMPONENT})
11+
@Retention(RetentionPolicy.RUNTIME)
12+
@Constraint(validatedBy = PasswordValidator.class)
13+
public @interface Password {
14+
15+
String message() default "비밀번호는 영문, 숫자, 특수문자를 포함한 8자리 이상이어야 합니다.";
16+
17+
Class<?>[] groups() default {};
18+
19+
Class<? extends Payload>[] payload() default {};
20+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.example.solidconnection.auth.dto.validation;
2+
3+
import jakarta.validation.ConstraintValidator;
4+
import jakarta.validation.ConstraintValidatorContext;
5+
6+
public class PasswordValidator implements ConstraintValidator<Password, String> {
7+
8+
@Override
9+
public boolean isValid(String value, ConstraintValidatorContext context) {
10+
if (value == null || value.isBlank()) {
11+
return true;
12+
}
13+
14+
return value.matches("^(?=.*[A-Za-z])(?=.*\\d)(?=.*[!@#$%^&*()_+\\-={}\\[\\]|:;\"'<>,.?/`~])\\S{8,}$");
15+
}
16+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.example.solidconnection.auth.dto.validation;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.jupiter.api.DisplayName;
6+
import org.junit.jupiter.api.Test;
7+
8+
@DisplayName("비밀번호 유효성 검사 테스트")
9+
class PasswordValidatorTest {
10+
11+
private final PasswordValidator validator = new PasswordValidator();
12+
13+
@Test
14+
void 정상_패턴이면_true를_반환한다() {
15+
assertThat(validator.isValid("abcd123!", null)).isTrue();
16+
}
17+
18+
@Test
19+
void 숫자가_없으면_false를_반환한다() {
20+
assertThat(validator.isValid("abcdefg!", null)).isFalse();
21+
}
22+
23+
@Test
24+
void 영문자가_없으면_false를_반환한다() {
25+
assertThat(validator.isValid("1234567!", null)).isFalse();
26+
}
27+
28+
@Test
29+
void 특수문자가_없으면_false를_반환한다() {
30+
assertThat(validator.isValid("abcd1234", null)).isFalse();
31+
}
32+
33+
@Test
34+
void 공백을_포함하면_false를_반환한다() {
35+
assertThat(validator.isValid("abcd123! ", null)).isFalse();
36+
}
37+
38+
@Test
39+
void 길이가_8자_미만이면_false를_반환한다() {
40+
assertThat(validator.isValid("ab1!ab", null)).isFalse();
41+
}
42+
}

0 commit comments

Comments
 (0)