validator/isPassword.js


/**
 * 检测值是否符合密码强度
 * 注意该校验只校验是否存在不同字符(大小写字母、数字、特殊符号),不判断长度
 * 
 * @static
 * @alias module:Validator.isPassword
 * @since 1.1.0
 * @param {String} value 要检测的值
 * @param {Object} [options] 配置项
 * @param {Number} [options.level=2] 密码强度 1-包含一种字符 2-包含两种字符 3-包含三种字符。(大写字母、小写字母、数字、特殊字符)
 * @param {Boolean} [options.ignoreCase=false] 忽略大小写,即大小写字母视为一种字符
 * @param {String} [options.special=-_!@#$%^&*] 特殊字符
 * @returns {Boolean} 值是否符合密码强度
 * @example
 * 
 * isPassword('a12345678');
 * // => true
 * 
 * isPassword('a12345678', {level: 3});
 * // => false
 * 
 * isPassword('Aa12345678', {level: 3});
 * // => true
 * 
 * isPassword('Aa12345678', {level: 3, ignoreCase: true});
 * // => false
 * 
 * isPassword('_Aa12345678', {level: 3, ignoreCase: true});
 * // => true
 * 
 * // 仅支持 数字、字母、特殊字符,其他字符如中文字符是校验不通过的
 * isPassword('_Aa一二三45678', {level: 3, ignoreCase: true});
 * // => false
 * 
 * isPassword(' _Aa12345678', {level: 3, ignoreCase: true});
 * // => false
 */
function isPassword(value, {
  level = 2,
  ignoreCase = false,
  special = "-_!@#$%^&*"
} = {}) {
  const numRegStr = "\\d";
  const lowercaseRegStr = "a-z";
  const uppercaseRegStr = "A-Z";
  const ignorecaseRegStr = "a-zA-Z";

  let reg = null;

  if (level === 1) {
    reg = new RegExp(`^[${numRegStr}${ignorecaseRegStr}${special}]+$`);
  } else if (level === 2) {
    if (ignoreCase) {
      reg = new RegExp(`^(?![${ignorecaseRegStr}]+$)(?!${numRegStr}+$)(?![${special}]+$)[${ignorecaseRegStr}${numRegStr}${special}]+$`);
    } else {
      reg = new RegExp(`^(?![${lowercaseRegStr}]+$)(?![${uppercaseRegStr}]+$)(?!${numRegStr}+$)(?![${special}]+$)[${ignorecaseRegStr}${numRegStr}${special}]+$`);
    }
  } else if (level === 3) {
    if (ignoreCase) {
      // ^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&*]+$)(?![a-zA-z\d]+$)(?![a-zA-z!@#$%^&*]+$)(?![\d!@#$%^&*]+$)[a-zA-Z\d!@#$%^&*]+$
      reg = new RegExp(`^(?![${ignorecaseRegStr}]+$)(?!${numRegStr}+$)(?![${special}]+$)(?![${ignorecaseRegStr}${numRegStr}]+$)(?![${ignorecaseRegStr}${special}]+$)(?![${numRegStr}${special}]+$)[${ignorecaseRegStr}${numRegStr}${special}]+$`);
    } else {
      reg = new RegExp(`^(?![${lowercaseRegStr}]+$)(?![${uppercaseRegStr}]+$)(?!${numRegStr}+$)(?![${special}]+$)(?![${lowercaseRegStr}${numRegStr}]+$)(?![${uppercaseRegStr}${numRegStr}]+$)(?![${lowercaseRegStr}${special}]+$)(?![${uppercaseRegStr}${special}]+$)(?![${numRegStr}${special}]+$)[${ignorecaseRegStr}${numRegStr}${special}]+$`);
    }
  }

  return reg ? reg.test(value) : false;
}

export default isPassword;