본문 바로가기
개발 이론/Spring

[Spring]org.passy 사용하여 @Password validation

by dal_been 2023. 11. 7.
728x90

Validation을 공부하다가 org.passy를 처음으로 접하게 되었다.

 

비밀번호 규칙을 강제하는 라이브러리이다.

비밀번호 검증과 관련하여 간편하게 유효성 검사를 수행할 수 있다

 

의존성추가

 

<dependencies>
   <dependency>
        <groupId>org.passay</groupId>
        <artifactId>passay</artifactId>
        <version>1.6.4</version>
   </dependency>
</dependencies>

 

 

커스텀 애노테이션 정의하기 위해 ConstraintValidator 구현하여 만들기

 

import org.passay.*;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.ArrayList;
import java.util.List;

public class PasswordRuleValidator implements ConstraintValidator<Password, String> {

    private static final int MIN_COMPLEX_RULES = 2;
    private static final int MAX_REPETITIVE_CHARS = 3;
    private static final int MIN_SPECIAL_CASE_CHARS = 1;
    private static final int MIN_UPPER_CASE_CHARS = 1;
    private static final int MIN_LOWER_CASE_CHARS = 1;
    private static final int MIN_DIGIT_CASE_CHARS = 1;

    @Override
    public boolean isValid(String password, ConstraintValidatorContext context) {
        List<Rule> passwordRules = new ArrayList<>();
        passwordRules.add(new LengthRule(8, 30));
        CharacterCharacteristicsRule characterCharacteristicsRule  =
                new CharacterCharacteristicsRule(MIN_COMPLEX_RULES,
                        new CharacterRule(EnglishCharacterData.Special, MIN_SPECIAL_CASE_CHARS),
                        new CharacterRule(EnglishCharacterData.UpperCase,MIN_UPPER_CASE_CHARS),
                        new CharacterRule(EnglishCharacterData.LowerCase,MIN_LOWER_CASE_CHARS),
                        new CharacterRule(EnglishCharacterData.Digit,MIN_DIGIT_CASE_CHARS));
        passwordRules.add(characterCharacteristicsRule);
        passwordRules.add(new RepeatCharacterRegexRule(MAX_REPETITIVE_CHARS));
        PasswordValidator passwordValidator = new PasswordValidator(passwordRules);
        PasswordData passwordData = new PasswordData(password);
        RuleResult ruleResult = passwordValidator.validate(passwordData);
        return ruleResult.isValid();




    }
}

 

 

 

애너테이션 생성

 

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordRuleValidator.class)
public @interface Password {
    String message() default "패스워드가 조건과 맞지않음";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

}

 

  • @Target : 적용할 대상의 타입 지정
  • @Retention : 언제까지 효력을 유지하고 살아남는지 지정
  • @Constraint : 빈 밸리데이션 제약 사항을 포함하는 애너테이션임을 의미
  • message() : 유효성 검증 실패할때 표시할 문자열
  • Class<?>[] groups() : 메서드를 사용해서 그룹을 지정하면 밸리데이션을 그룹별로 구분해서 적용가능
  • Class<? extends Payload>[] payload() : 밸리데이션 클라이언트가 사용하는 메타데이터를 전달하기 위해 사용된다