一、导入pom依赖
<!--密码生成器和验证器-->
<dependency>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
<version>1.3.1</version>
</dependency>
二、工具类
package com.genertech.plm.aia.util;
import org.passay.CharacterData;
import org.passay.*;
import java.util.Arrays;
import java.util.List;
/**
* @beLongProjecet: aia-application-access-control
* @beLongPackage: com.genertech.plm.aia.util
* @author: huo.qw
* @createTime: 2023/08/30 下午 03:09
* @description:
* @version: v1.0
*/
public class PasswordValidatorAndGenerator {
/**
* 验证规则: 8-16位的字母、数字、特殊字符组合
*
* @return
*/
private static List<Rule> ruleList() {
return Arrays.asList(
//长度规则,8-16
new LengthRule(8, 16),
//字符规则 至少有一个字母(不区分大小写)
new CharacterRule(EnglishCharacterData.Alphabetical, 1),
/*//字符规则 至少有一个大写字母
new CharacterRule(EnglishCharacterData.UpperCase, 1),
//字符规则 至少有一个小写字母
new CharacterRule(EnglishCharacterData.LowerCase, 1),*/
//字符规则 至少一个数字
new CharacterRule(EnglishCharacterData.Digit, 1),
//字符规则 至少有一个特殊字符
new CharacterRule(EnglishCharacterData.Special, 1),
/*//非法顺序规则 不允许有5个连续字母表顺序的字母,比如不允许abCde
new IllegalSequenceRule(EnglishSequenceData.Alphabetical, 5, false),
//非法顺序规则 不允许有5个连续数字顺序的数字 比如不允许12345
new IllegalSequenceRule(EnglishSequenceData.Numerical, 5, false),
//非法顺序规则 不允许有5个连续键盘顺序的字母 比如不允许asDfg
new IllegalSequenceRule(EnglishSequenceData.USQwerty, 5, false),*/
//空格规则,不能有空格
new WhitespaceRule()
);
}
public static RuleResult isValid(String password) {
PasswordValidator validator = new PasswordValidator(ruleList());
RuleResult ruleResult = validator.validate(new PasswordData(password));
return ruleResult;
}
/**
* 生成规则(设计时注意生成的密码要能通过检验规则!生成后最好调用校验方法校验以确保生成的是合法的密码)
*
* @return
*/
private static List<CharacterRule> generatePasswordRule() {
return Arrays.asList(
//字符规则 至少有1个大写字母
new CharacterRule(EnglishCharacterData.UpperCase, 1),
//字符规则 至少有1个小写字母
new CharacterRule(EnglishCharacterData.LowerCase, 1),
//字符规则 至少3个数字
new CharacterRule(EnglishCharacterData.Digit, 3)
/*//字符规则 至少有1个特殊字符
,new CharacterRule(EnglishCharacterData.Special, 1)*/
//字符规则 至少有1个自定义的特殊字符
, new CharacterRule(RangeCharacterData.range, 1)
);
}
public static String generatePassword() {
PasswordGenerator generator = new PasswordGenerator();
// 指定生成的默认密码长度为8位
String generatedPwd = generator.generatePassword(8, generatePasswordRule());
// 生成后最好调用校验方法校验以确保生成的是合法的密码
while (!isValid(generatedPwd).isValid()){
generatedPwd = generator.generatePassword(8, generatePasswordRule());
}
return generatedPwd;
}
/**
* 自定义生成器
*/
private static enum RangeCharacterData implements CharacterData {
range("INSUFFICIENT_SPECIAL", "~!@#$%^&*()_+");
private String errorCode;
private String characters;
private RangeCharacterData(String code, String charString) {
this.errorCode = code;
this.characters = charString;
}
@Override
public String getErrorCode() {
return this.errorCode;
}
@Override
public String getCharacters() {
return this.characters;
}
}
public static void main(String[] args) {
RuleResult valid = isValid("A1#asDfgA1#asDfg");
System.out.println(valid.toString());
System.out.println(generatePassword());
}
}