首先说下需求:
1、长度不少于8个字符
2、口令应该为以下4类字符的组合:大写字母(A-Z)、小写字母(a-z)、数字(0-9)和特殊字符。
每类字符至少包含一个,如果某类字符只包含一个,那么该字符不应该为首字符或尾字符。
3、不为重复某些字符的组合(如A1a#A1a#)。
4、不包含本人姓名、出生日期、登录名、email等与本人相关的信息
5、不为历史口令
然后就是实现啦,直接贴代码
public SimpleResultVo checkUserPwd(String password) {
SimpleResultVo simpleResultVo = new SimpleResultVo();
simpleResultVo.success = false;
// 统计各类字符的数量
int number = 0;
int lowerCase = 0;
int upperCase = 0;
int specialCase = 0;
String regex = "^.*[-/^/$/.//,:~`!@#%&/*/|/?/+/_/=/(/)/[/]/{/}]+.*$";
for (int i = 0; i < password.length(); i++) {
char ch = password.charAt(i);
String ch1 = String.valueOf(ch);
if (ch >= '0' && ch <= '9') {
number++;
} else if (ch >= 'a' && ch <= 'z') {
lowerCase++;
} else if (ch >= 'A' && ch <= 'Z') {
upperCase++;
} else if (ch1.matches(regex)) {
specialCase++;
} else {
// logger.info("非法字符"+ch1);
}
}
// System.out.println("number=" + number);
// System.out.println("lowerCase=" + lowerCase);
// System.out.println("upperCase=" + upperCase);
// System.out.println("specialCase=" + specialCase);
// 获取口令的首尾字符
char index = password.charAt(0);
char end = password.charAt(password.length() - 1);
String index1 = String.valueOf(index);
String end1 = String.valueOf(end);
// 口令不少于8位
if (password.matches("^.{8,}$")) {
// 口令应该为以下4类字符的组合:大写字母(A-Z)、小写字母(a-z)、数字(0-9)和特殊字符
if (password.matches("^.*[a-z]+.*$")
&& password.matches("^.*[A-Z]+.*$")
&& password.matches("^.*[0-9]+.*$")
&& password.matches(regex)) {
// 每类字符至少包含一个,如果某类字符只包含一个,那么该字符不应该为首字符或尾字符。
if (index >= '0' && index <= '9' && number == 1) {
simpleResultVo.message = "口令首字符为数字但数字只有一位";
} else if (end >= '0' && end <= '9' && number == 1) {
simpleResultVo.message = "口令尾字符为数字但数字只有一位";
} else if (index >= 'a' && index <= 'z' && lowerCase == 1) {
simpleResultVo.message = "口令首字符为小写字母但小写字母只有一位";
} else if (end >= 'a' && end <= 'z' && lowerCase == 1) {
simpleResultVo.message = "口令尾字符为小写字母但小写字母只有一位";
} else if (index >= 'A' && index <= 'Z' && upperCase == 1) {
simpleResultVo.message = "口令首字符为大写字母但大写字母只有一位";
} else if (end >= 'A' && end <= 'Z' && upperCase == 1) {
simpleResultVo.message = "口令尾字符为大写字母但大写字母只有一位";
} else if (index1.matches(regex) && specialCase == 1) {
simpleResultVo.message = "口令首字符为特殊字符但特殊字符只有一位";
} else if (end1.matches(regex) && specialCase == 1) {
simpleResultVo.message = "口令尾字符为特殊字符但特殊字符只有一位";
}
// 不为重复某些字符的组合(如A1a#A1a#) 2代表某连续两个字符重复(abab)
if (!password.matches("^.*(.{2})(.*)\\1+.*$")) {
//到这之后就需要和数据库里的信息进行比对了,这个代码不通用,根据自己的需求进行修改。
//注册时没有个人信息
if (authentication == null) {
simpleResultVo.message = "口令合法";
simpleResultVo.success = true;
} else {
//修改密码时
Map<String, Object> map = authentication
.getCurrentAccount().getExtendAttributes();
String name = map.get("name").toString();
String loginName = map.get("login_name").toString();
String idNo = map.get("iddoc_no").toString();
String accountId = authentication.getCurrentAccount()
.getAccountId();
// 不包含本人姓名、出生日期、登录名、email等与本人相关的信息
if (!password.equals(name)
&& !password.equals(loginName)
&& !password.equals(idNo)) {
String pwd = UserCryptoUtils.encode(password);
SimpleResultVo resultVo = userPwdHistoryService
.selectPwdHistory(accountId, pwd);
// 不为历史口令
if (resultVo.success) {
simpleResultVo.message = "口令合法";
simpleResultVo.success = true;
} else {
simpleResultVo.message = "历史口令";
}
} else {
simpleResultVo.message = "包含个人信息";
}
}
} else {
simpleResultVo.message = "字符组合重复";
}
} else {
simpleResultVo.message = "口令未包含四类字符";
}
} else {
simpleResultVo.message = "口令长度不到8位";
}
logger.info("口令验证结果:" + simpleResultVo.toString());
return simpleResultVo;
}