密码策略
引入passay(帕赛)组件;一般大多数web应用有自己的密码策略————也就是强制用户创建难以破解的复杂密码。我们可以利用Passay库生成或检查密码,创建强大的密码策略。
<ip2region.version>2.6.4</ip2region.version>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>${ip2region.version}</version>
</dependency>
创建特殊字符类
import org.passay.CharacterData;
/**
* @Author gsh
* @Description //密码特殊字符
* @Date 2023-02-03 10:57:54
*/
public 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;
}
}
创建密码验证生成工具类
import org.passay.*;
import java.util.Arrays;
import java.util.List;
/**
* @Author gsh
* @Description //密码规则验证和生成工具类
* @Date 2023-02-03 11:00:21
*/
public class PasswordUtils {
/**
* @Author gsh
* @Description //密码验证规则
* @Date 2023-02-03 11:01:28
*/
private static List<Rule> ruleList() {
return 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, 3),
//非法顺序规则 不允许有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()
);
}
/**
* @Author gsh
* @Description //验证密码规则
* @Date 2023-02-03 10:58:48
*/
public static boolean isValid(String password) {
PasswordValidator validator = new PasswordValidator(ruleList());
return validator.validate(new PasswordData(password)).isValid();
}
/**
* @Author gsh
* @Description //密码生成规则
* @Date 2023-02-03 11:03:22
*/
private static List<CharacterRule> generatePasswordRule() {
return Arrays.asList(
//字符规则 至少有一个大写字母
new CharacterRule(EnglishCharacterData.UpperCase, 1),
//字符规则 至少有一个小写字母
new CharacterRule(EnglishCharacterData.LowerCase, 1),
//字符规则 至少一个数字
new CharacterRule(EnglishCharacterData.Digit, 1),
//字符规则 至少有一个特殊字符
// new CharacterRule(EnglishCharacterData.Special, 1),
new CharacterRule(RangeCharacterData.range, 3)
);
}
/**
* @Author gsh
* @Description //密码生成方法
* @Date 2023-02-03 10:59:14
*/
public static String generatePassword(Integer len) {
if (null == len || 0 == len) {
len = 8;
}
PasswordGenerator generator = new PasswordGenerator();
return generator.generatePassword(len, generatePasswordRule());
}
}