密码策略-password policy

密码策略

引入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());
    }
}

猜你喜欢

转载自blog.csdn.net/heroguo007/article/details/128865243