PasswordDto:
package com.imooc.uaa.domain.dto;
import com.imooc.uaa.validation.annotation.ValidPassword;
import lombok.Data;
@Data
public class PasswordDto {
private String oldPassword;
@ValidPassword
private String newPassword;
}
使用的密码依赖
org.passay passay
1.6.0
添加对应的注解ValidPassword
package com.imooc.uaa.validation.annotation;
import com.imooc.uaa.validation.PasswordConstraintValidator;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@documented
@Constraint(validatedBy = PasswordConstraintValidator.class)
@Target({ TYPE, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
public @interface ValidPassword {
String message() default "Invalid Password";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
}
添加密码的校验实现
package com.imooc.uaa.validation; import com.imooc.uaa.validation.annotation.ValidPassword; import lombok.RequiredArgsConstructor; import lombok.val; import org.passay.*; import org.passay.spring.SpringMessageResolver; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.Arrays; @RequiredArgsConstructor public class PasswordConstraintValidator implements ConstraintValidator{ private final SpringMessageResolver messageResolver; @Override public void initialize(final ValidPassword constraintAnnotation) {} @Override public boolean isValid(final String password, final ConstraintValidatorContext context) { val validator = new PasswordValidator(messageResolver, Arrays.asList( // 长度规则:8 - 30 位 new LengthRule(8, 30), // 至少有一个大写字母 new CharacterRule(EnglishCharacterData.UpperCase, 1), // 至少有一个小写字母 new CharacterRule(EnglishCharacterData.LowerCase, 1), // 至少有一个数字 new CharacterRule(EnglishCharacterData.Digit, 1), // 至少有一个特殊字符 new CharacterRule(EnglishCharacterData.Special, 1), // 不允许连续 3 个字母,按字母表顺序 // alphabetical is of the form 'abcde', numerical is '34567', qwery is 'asdfg' // the false parameter indicates that wrapped sequences are allowed; e.g. 'xyzabc' new IllegalSequenceRule(EnglishSequenceData.Alphabetical, 5, false), // 不允许 3 个连续数字 new IllegalSequenceRule(EnglishSequenceData.Numerical, 5, false), // 不允许 QWERTY 键盘上的三个连续相邻的按键所代表的字符 new IllegalSequenceRule(EnglishSequenceData.USQwerty, 5, false), // 不允许包含空格 new WhitespaceRule())); val result = validator.validate(new PasswordData(password)); if (result.isValid()) { return true; } context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate(String.join(",", validator.getMessages(result))) .addConstraintViolation(); return false; } }



