js密码校验

1,546 阅读2分钟

(1) 密码长度要求8-20位,且至少包含大小写字符、数字和特殊字符中的3种或以上,字符区分大小写(特殊字符包括:!"#$%&'()*+,-.<=>?@[]^_`{|}~);

const reg =/^(?=.*[a-z])(?=.*[A-Z])(?=.*[1-9])(?=.*[\W]).{8,20}$/;

(2) 不能包含“password”、“admin” 及其变体(例如含大小写的passWord);

export const  checkrReg = (str) => {
  var flag = true;
  const strSub = str.toLocaleUpperCase();
  const text = strSub.indexOf("ADMIN");
  const textPass = strSub.indexOf("PASSWORD");
  if (text !== -1) {
    const a = str.substring(text, text + 5);
    if (a === 'admin' || a === 'ADMIN') {
       flag = false;
    }
    for (var i in a) {
      if (a[i] !== a[i].toUpperCase()) {
        flag = false;
      }
    }
  } else if (textPass !== -1) {
    const b = str.substring(textPass, textPass + 8);
    if (b === 'password' || b === 'PASSWORD') {
       flag = false;
    }
    for (var i in b) {
      if (b[i] !== b[i].toUpperCase()) {
        flag = false;
      }
    }
  }
  return flag;
}

(3) 不能包含大于或等于3个或以上的连续相邻字母或数字(例如:abc、DEFG、123)

export const  checkRepeat = (str) => {
  var arr = str.split('');
  var flag = true;
  for (var i = 1; i < arr.length-1; i++) {
    var firstIndex = arr[i-1].charCodeAt();
    var secondIndex = arr[i].charCodeAt();
    var thirdIndex = arr[i+1].charCodeAt();
    thirdIndex - secondIndex == 1;
    secondIndex - firstIndex==1;
    if((thirdIndex - secondIndex == 1)&&(secondIndex - firstIndex==1)){
      flag =  false;
    }
  }
  return flag;
}

(4) 不能包含2位及以上连续重复型字母或数字(例如:ABAB、1212)

const reg2 = /([a-zA-Z0-9])((?!\1)[a-zA-Z0-9])(?!\2)\1\2/g;

(5) 不能包含连续3位及以上重复型字母或数字(例如:aaa、BBBB、111)

const reg1 = /(\w)*(\w)\2{2}(\w)*/g;

(6) 不能包含用户名后3位。

const userName = this.ruleForm.loginKey.substr(-3, 3);
const userPassword = value.indexOf(userName);
<!-- 修改密码 -->
<el-dialog
  :visible.sync="visible"
  v-if="visible"
  :close-on-click-modal="false"
  :close-on-press-escape="false"
  :show-close="false"
  title="修改密码"
  class="pwd"
  width="450px">
  <el-form ref="formValidate" class="changeForm" :model="formValidate" :rules="ruleValidate">
    <el-form-item label="旧密码" prop="oldPwd">
      <el-input v-model="formValidate.oldPwd" class="changeInput" clearable type="password" placeholder="请输入原密码" show-password></el-input>
      <i class="el-icon-check" v-if="changeOldFlag == 1" color="#35B449"/>
      <i class="el-icon-close" v-else-if="changeOldFlag == 2"  color="#f00"/>
    </el-form-item>
    <el-form-item label="新密码" prop="newPwd">
      <el-input v-model="formValidate.newPwd" class="changeInput" clearable type="password" placeholder="8~20个字符,区分大小,必须包含数字和字母" show-password></el-input>
      <i class="el-icon-check" v-if="changeFlag == 1" color="#35B449"/>
      <i class="el-icon-close" v-else-if="changeFlag == 2" color="#f00"/>
    </el-form-item>
    <el-form-item label="重复密码" prop="confirmNewPwd">
      <el-input v-model="formValidate.confirmNewPwd" class="changeInput" clearable type="password" placeholder="请再次输入密码,必须和新密码一致" show-password></el-input>
      <i class="el-icon-check" v-if="changeAgainFlag == 1" color="#35B449"/>
      <i class="el-icon-close" v-else-if="changeAgainFlag == 2" color="#f00"/>
    </el-form-item>
    <el-form-item class="changeBtnbox">
      <el-button type="primary" @click.native="handerPwdSubmit" style="position: relative">提交修改</el-button>
      <img style="position: absolute;right: 25px;top: 5px;cursor: pointer" src="../assets/images/what.png" width="20" height="20" alt="" @click="showReg()">
    </el-form-item>
  </el-form>
</el-dialog>
const pwdOldCheck = (rule, value, callback) => {
  if (value.length < 1) {
    this.changeOldFlag = 2;
    callback(new Error('旧密码不能为空!'));
  } else if (value !== this.ruleForm.password) {
    this.changeOldFlag = 2;
    callback(new Error('旧密码不正确!'));
  } else {
    this.changeOldFlag = 1;
    callback();
  }
};
const pwdCheck = async (rule, value, callback) => {
  const userName = this.ruleForm.loginKey.substr(-3, 3);
  const userPassword = value.indexOf(userName);
  const reg = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)(?![a-zA-Z0-9]+$)(?![a-zA-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9\W_!@#$%^&*`~()-+=]+$)(?![0-9A-Z\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{8,20}$/;
  // const reg1 = /(?!.*(?<re1>[a-zA-Z0-9])\k<re1>{2})(?<!.*(?<re2>[a-zA-Z0-9])\k<re2>{2})/;
  const reg1 = /(\w)*(\w)\2{2}(\w)*/g;
  const reg2 = /([a-zA-Z0-9])((?!\1)[a-zA-Z0-9])(?!\2)\1\2/g;
  if (value.length < 8) {
    this.changeFlag = 2;
    callback(new Error('密码不能少于8位!'));
  } else if (value.length > 20) {
    this.changeFlag = 2;
    callback(new Error('密码最长不能超过20位!'));
  } else if (!reg.test(value)) {
    this.changeFlag = 2;
    callback(new Error('密码输入有误,请检查格式是否正确!'));
  } else if (reg1.test(value)) {
    this.changeFlag = 2;
    callback(new Error('不能包含连续3位及以上重复型字母或数字(例如:aaa、BBBB、111)'));
  } else if (checkRepeat(value) === false) {
    this.changeFlag = 2;
    callback(new Error('不能包含大于或等于3个或以上的连续相邻字母或数字(例如:abc、DEFG、123)'));
  } else if (userPassword !== -1) {
    this.changeFlag = 2;
    callback(new Error('不能包含用户名后3位。'));
  } else if (reg2.test(value)) {
    this.changeFlag = 2;
    callback(new Error('不能包含2位及以上连续重复型字母或数字(例如:ABAB、abcabc、1212)'));
  } else if (checkrReg(value) === false) {
    this.changeFlag = 2;
    callback(new Error('不能包含password,admin及其变体(例如含大小写的passWord)'));
  } else {
    this.changeFlag = 1;
    callback();
  }
};
const pwdAgainCheck = async (rule, value, callback) => {
  if (value.length < 1) {
    this.changeAgainFlag = 2;
    callback(new Error('重复密码不能为空!'));
  } else if (this.formValidate.newPwd !== this.formValidate.confirmNewPwd) {
    this.changeAgainFlag = 2;
    callback(new Error('两次输入密码不一致!'));
  } else {
    this.changeAgainFlag = 1;
    callback();
  }
};
changeFlag: 0,
changeAgainFlag: 0,
changeOldFlag: 0,
formValidate: {
  oldPwd: '',
  newPwd: '',
  confirmNewPwd: '',
},
ruleValidate: {
  oldPwd: [
    { required: true, validator: pwdOldCheck, trigger: 'blur' },
  ],
  newPwd: [
    { required: true, validator: pwdCheck, trigger: 'blur' },
  ],
  confirmNewPwd: [
    { required: true, validator: pwdAgainCheck, trigger: 'blur' },
  ],
},