提交 57d76638 编写于 作者: 雪洛's avatar 雪洛

feat: password strength

上级 6935c641
...@@ -11,6 +11,10 @@ const ERROR = { ...@@ -11,6 +11,10 @@ const ERROR = {
PASSWORD_ERROR_EXCEED_LIMIT: 'uni-id-password-error-exceed-limit', PASSWORD_ERROR_EXCEED_LIMIT: 'uni-id-password-error-exceed-limit',
INVALID_USERNAME: 'uni-id-invalid-username', INVALID_USERNAME: 'uni-id-invalid-username',
INVALID_PASSWORD: 'uni-id-invalid-password', INVALID_PASSWORD: 'uni-id-invalid-password',
INVALID_PASSWORD_SUPER: 'uni-id-invalid-password-super',
INVALID_PASSWORD_STRONG: 'uni-id-invalid-password-strong',
INVALID_PASSWORD_MEDIUM: 'uni-id-invalid-password-medium',
INVALID_PASSWORD_WEAK: 'uni-id-invalid-password-weak',
INVALID_MOBILE: 'uni-id-invalid-mobile', INVALID_MOBILE: 'uni-id-invalid-mobile',
INVALID_EMAIL: 'uni-id-invalid-email', INVALID_EMAIL: 'uni-id-invalid-email',
INVALID_NICKNAME: 'uni-id-invalid-nickname', INVALID_NICKNAME: 'uni-id-invalid-nickname',
......
...@@ -29,21 +29,6 @@ baseValidator.username = function (username) { ...@@ -29,21 +29,6 @@ baseValidator.username = function (username) {
} }
} }
baseValidator.password = function (password) {
const errCode = ERROR.INVALID_PASSWORD
if (!isValidString(password)) {
return {
errCode
}
}
if (password.length < 6) {
// 密码长度不能小于6
return {
errCode
}
}
}
baseValidator.mobile = function (mobile) { baseValidator.mobile = function (mobile) {
const errCode = ERROR.INVALID_MOBILE const errCode = ERROR.INVALID_MOBILE
if (!isValidString(mobile)) { if (!isValidString(mobile)) {
...@@ -245,10 +230,62 @@ function isMatchArrayType (arr, rule) { ...@@ -245,10 +230,62 @@ function isMatchArrayType (arr, rule) {
return true return true
} }
// 特殊符号 https://www.ibm.com/support/pages/password-strength-rules ~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/
// const specialChar = '~!@#$%^&*_-+=`|\(){}[]:;"\'<>,.?/'
// const specialCharRegExp = /^[~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]$/
// for (let i = 0, arr = specialChar.split(''); i < arr.length; i++) {
// const char = arr[i]
// if (!specialCharRegExp.test(char)) {
// throw new Error('check special character error: ' + char)
// }
// }
// 密码强度表达式
const passwordRules = {
// 密码必须包含大小写字母、数字和特殊符号
super: /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/])[0-9a-zA-Z~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]{8,16}$/,
// 密码必须包含字母、数字和特殊符号
strong: /^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/])[0-9a-zA-Z~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]{8,16}$/,
// 密码必须为字母、数字和特殊符号任意两种的组合
medium: /^(?![0-9]+$)(?![a-zA-Z]+$)(?![~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]+$)[0-9a-zA-Z~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]{8,16}$/,
// 密码必须包含字母和数字
weak: /^(?=.*[0-9])(?=.*[a-zA-Z])[0-9a-zA-Z~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]{6,16}$/
}
function createPasswordVerifier ({
passwordStrength = 'medium'
} = {}) {
return function (password) {
const passwordRegExp = passwordRules[passwordStrength]
if (!passwordRegExp) {
throw new Error('Invalid password strength config: ' + passwordStrength)
}
const errCode = ERROR.INVALID_PASSWORD
if (!isValidString(password)) {
return {
errCode
}
}
if (!passwordRegExp.test(password)) {
return {
errCode: errCode + '-' + passwordStrength
}
}
}
}
class Validator { class Validator {
constructor () { constructor ({
passwordStrength = 'medium'
} = {}) {
this.baseValidator = baseValidator this.baseValidator = baseValidator
this.customValidator = Object.create(null) this.customValidator = Object.create(null)
this.mixin(
'password',
createPasswordVerifier({
passwordStrength
})
)
} }
mixin (type, handler) { mixin (type, handler) {
......
...@@ -39,14 +39,14 @@ const testCaseList = [{ ...@@ -39,14 +39,14 @@ const testCaseList = [{
} }
}, { }, {
value: { value: {
password: '123456' password: '123456abc'
}, },
schema: { schema: {
password: 'password' password: 'password'
} }
}, { }, {
value: { value: {
password: '123456' password: '123456def'
}, },
schema: { schema: {
password: 'password' password: 'password'
......
...@@ -109,7 +109,9 @@ module.exports = { ...@@ -109,7 +109,9 @@ module.exports = {
}) })
this.config = this.configUtils.getPlatformConfig() this.config = this.configUtils.getPlatformConfig()
this.validator = new Validator() this.validator = new Validator({
passwordStrength: this.config.passwordStrength || 'medium'
})
/** /**
* 示例:覆盖密码验证规则 * 示例:覆盖密码验证规则
*/ */
......
...@@ -16,6 +16,10 @@ const sentence = { ...@@ -16,6 +16,10 @@ const sentence = {
'uni-id-password-error-exceed-limit': 'The number of password errors is excessive', 'uni-id-password-error-exceed-limit': 'The number of password errors is excessive',
'uni-id-invalid-username': 'Invalid username', 'uni-id-invalid-username': 'Invalid username',
'uni-id-invalid-password': 'invalid password', 'uni-id-invalid-password': 'invalid password',
'uni-id-invalid-password-super': 'Passwords must have 8-16 characters and contain uppercase letters, lowercase letters, numbers, and symbols.',
'uni-id-invalid-password-strong': 'Passwords must have 8-16 characters and contain letters, numbers and symbols.',
'uni-id-invalid-password-medium': 'Passwords must have 8-16 characters and contain at least two of the following: letters, numbers, and symbols.',
'uni-id-invalid-password-weak': 'Passwords must have 6-16 characters and contain letters and numbers.',
'uni-id-invalid-mobile': 'Invalid mobile phone number', 'uni-id-invalid-mobile': 'Invalid mobile phone number',
'uni-id-invalid-email': 'Invalid email address', 'uni-id-invalid-email': 'Invalid email address',
'uni-id-invalid-nickname': 'Invalid nickname', 'uni-id-invalid-nickname': 'Invalid nickname',
......
...@@ -16,6 +16,10 @@ const sentence = { ...@@ -16,6 +16,10 @@ const sentence = {
'uni-id-password-error-exceed-limit': '密码错误次数过多,请稍后再试', 'uni-id-password-error-exceed-limit': '密码错误次数过多,请稍后再试',
'uni-id-invalid-username': '用户名不合法', 'uni-id-invalid-username': '用户名不合法',
'uni-id-invalid-password': '密码不合法', 'uni-id-invalid-password': '密码不合法',
'uni-id-invalid-password-super': '密码必须包含大小写字母、数字和特殊符号,长度8-16位',
'uni-id-invalid-password-strong': '密码必须包含字母、数字和特殊符号,长度8-16位不合法',
'uni-id-invalid-password-medium': '密码必须为字母、数字和特殊符号任意两种的组合,长度8-16位',
'uni-id-invalid-password-weak': '密码必须包含字母和数字,长度6-16位',
'uni-id-invalid-mobile': '手机号码不合法', 'uni-id-invalid-mobile': '手机号码不合法',
'uni-id-invalid-email': '邮箱不合法', 'uni-id-invalid-email': '邮箱不合法',
'uni-id-invalid-nickname': '昵称不合法', 'uni-id-invalid-nickname': '昵称不合法',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册