先上图,因为密码的规则比较杂乱,请教了同事后发现也没有什么好的统一校验处理方法,只能一个个if去判断,看着比较💩
密码校验工具集:
/**
* 密码校验
*/
passwordRules(str) {
// psdStrRules判断密码必须包含大小写字母数字特殊字符
// psdRepRules判断是否连续字符出现2次以上或者一共出现4次以上
let psdStrRules = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[~!@#$%^&*()_ +^\-={}:";'<>?,.\/])[\da-zA-Z~!@#$%^&*()_ +^\-={}:";'<>?,.\/]{8,32}$/;
// let psdRepRules = /^(.)\1{2}|(.)(.*\2){3}$/;
let psdRepRules = /(.)\1{2}/
if (psdRepRules.test(str) || !psdStrRules.test(str)) {
return false;
} else {
return true
}
},
// 同一字符不可连续3次或不连续4次以上
passwordRules1(str) {
let obj = {}
for (let i = 0; i <= str.length; i++) {
let key = str[i];
if (obj[key]) {
obj[key]++;
} else {
obj[key] = 1
}
}
return Object.values(obj).some(item => item > 4);
},
/**
* 校验新旧密码最少差别字符策略
*/
checkMinNewOldPwdDiffNum(newVal = '', oldVal = '', minNewOldPwdDiffNum = 0) {
let isMinNewOldPwdDiffNumOK = false
let nDiffNum = 0
//取新旧密码的个数差异,如果个数差异大于最少差别字符数,直接校验通过
nDiffNum = Math.abs(newVal.length - oldVal.length)
if (nDiffNum < minNewOldPwdDiffNum) {
let newPwdCur = 0
let oldPwdCur = 0
//遍历两个字符串,如果对应位置不一样的字符数加上个数差异大于nValue,则直接返回成功
while (newPwdCur !== newVal.length && oldPwdCur !== oldVal.length) {
if (newVal.charAt(newPwdCur) !== oldVal.charAt(oldPwdCur)) {
nDiffNum++
if (nDiffNum >= minNewOldPwdDiffNum) {
isMinNewOldPwdDiffNumOK = true
break
}
}
newPwdCur++
oldPwdCur++
}
} else {
isMinNewOldPwdDiffNumOK = true
}
return isMinNewOldPwdDiffNumOK
}