我想验证密码规则为: 密码长度应为 8 个字符,包含 1 个大写字母和 1 个小写字母、1 个数字和 1 个特殊字符。
password: new passwordComplexity({
min: 8,
max: 25,
lowerCase: 1,
upperCase: 1,
numeric: 1,
symbol: 1,
}),
password: Joi.string()
.min(8)
.max(25)
.required()
.label("Password")
.error((errors) => {
errors.forEach((err) => {
switch (err.type) {
case "any.empty":
err.message = passwordRequired;
break;
case "string.min":
err.message = passwordInvalid;
break;
case "string.max":
err.message = passwordInvalidMax;
break;
default:
}
});
return errors;
}),
我尝试了这些,但我猜密码复杂性仅适用于节点js。有这方面的帮助吗?
谢谢您的帮助。但是,我找到了解决方案:
password: Joi.string()
.min(8)
.max(25)
.regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
'password')
您可以尝试使用正则表达式并传入模式
Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$'))
有关如何使用正则表达式的更多信息:https://regexone.com/
Joi.string()
.regex(/[ -~]*[a-z][ -~]*/) // at least 1 lower-case
.regex(/[ -~]*[A-Z][ -~]*/) // at least 1 upper-case
.regex(/[ -~]*(?=[ -~])[^0-9a-zA-Z][ -~]*/) // basically: [ -~] && [^0-9a-zA-Z], at least 1 special character
.regex(/[ -~]*[0-9][ -~]*/) // at least 1 number
.min(4)
.required()
什么是
[ -~]
? (注意开头空格)
它表示 ASCII 可打印字符 从 \x20 到 \x7E,其中 can 表示密码的所有可能输入,包括数字、字母和符号,控制字符除外。
如果你不明白第4行,你可以搜索Lookahead Assertion和Character Class Intersection(这个是针对java的,而不是javascript)。
您可以将 Joi 与多个正则表达式一起使用,如下所示:
Joi.string()
.min(8)
.regex(/[A-Z]/, 'upper-case')
.regex(/[a-z]/, 'lower-case')
.regex(/[^\w]/, 'special character')
够好了吗?