【问题标题】:How to validate password using express-validator npm如何使用 express-validator npm 验证密码
【发布时间】:2016-01-13 07:16:45
【问题描述】:

我正在使用 node 编写 rest API,表达 web 模块。对于验证,我使用 express-validator npm。我想在密码字段上应用一些验证规则。

如何使用 express-validator 实现它?

我想申请密码的验证规则为:

  1. 分钟 8 个字符长。
  2. 至少一个大写字母。
  3. 至少一个小写字母。
  4. 至少有一个特殊字符。

我在this 链接中读到有一个名为 regex() 的函数可用。所以我尝试了它,但根本不工作。

我的做法:

req.check("password", "Password should be combination of one uppercase , one lower case, one special char, one digit and min 8 , max 20 char long").regex("/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/", "i");

错误

在express-js中,他们列出了所有方法,但没有找到解决我问题的方法/技巧。

【问题讨论】:

  • 根据我的研究,我发现可以使用 express-validator 的自定义验证功能。但是我需要定义 4 个函数来检查它还是有任何正则表达式模式函数可用??
  • 您的问题并未显示您的任何研究工作。你要求人们为你做你的工作。您随后找到了customValidators 选项,但仍不清楚您自己尝试了什么以及卡在哪里。查看文档,检查正则表达式对我来说似乎微不足道。
  • github.com/mlabieniec/complexity 这有一个很好的解决方案来构建正则表达式

标签: regex node.js validation express


【解决方案1】:

您所指的链接已经有将近 3 年的历史了。此后validator的API发生了变化。

要检查正则表达式,请使用.matches():

req.check("password", "...").matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/, "i");

【讨论】:

  • 我在第一次尝试中使用了“matches()”,但我犯了一个愚蠢的错误。我把模式放在引号里。比如' req.check("password", "...").matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0- 9a-zA-Z]{8,}$/, "i"); ' .
  • 现在可以正常工作了。完美。 :)。我仍然认为我的问题不属于投反对票。将来肯定会帮助其他人。
  • @SunilSharma 不再,不。我没有投反对票,但我会投赞成票让它回到 0。
  • @robertklep 你能解释一下正则表达式吗?
  • @dewnor 查看this page,它很好地解释了类似的工作原理:)
【解决方案2】:

我认为接受的答案已经过时。 RegExp 和 express-validator 不是 2017 年验证密码的最佳方法,因为正则表达式的晦涩难懂使应用程序无法维护并且容易出现错误。

password-validator 可以轻松定义和维护密码规则。这是一个示例:

var passwordValidator = require('password-validator');

var schema = new passwordValidator();

schema
  .is().min(8)
  .is().max(100)
  .has().uppercase()
  .has().lowercase();

console.log(schema.validate(req.body.password)); // prints a boolean

PS:我是password-validator的作者。

【讨论】:

    【解决方案3】:

    选择的答案不完整,因为它缺少对特殊字符的验证。正确答案应该是:

    req.checkBody("password", "Password must include one lowercase character, one uppercase character, a number, and a special character.").matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,}$/, "i");

    唯一真正的区别是我添加了(?=.*[^a-zA-Z0-9]) 表达式,以确保用户使用的字符不是数字或字母。

    【讨论】:

      【解决方案4】:

      使用 express-validator 的内置验证器,我能够使用没有正则表达式的内置验证器来检查密码。

      const validateStrongPassword = body("password")
        .isString()
        .isLength({ min: 8 })
        .not()
        .isLowercase()
        .not()
        .isUppercase()
        .not()
        .isNumeric()
        .not()
        .isAlpha();
      

      这验证密码中至少有一个非字母字符、一个小写字母、一个大写字母、最小长度和字母。

      【讨论】:

        【解决方案5】:
        check(
              "password1",
              "Please enter a password at least 8 character and contain At least one uppercase.At least one lower case.At least one special character. ",
            )
        .isLength({ min: 8 })
        .matches(
                  /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d@$.!%*#?&]/,
                )
        

        【讨论】:

          【解决方案6】:

          如果您使用数组进行验证,因此 req 对象不可用,您还可以执行以下操作:

          body('field_name').matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/, "i").withMessage('Password should be combination of one uppercase , one lower case, one special char, one digit and min 8 , max 20 char long'),
          

          【讨论】:

            【解决方案7】:

            有一个新的解决方案。来自文档:

            检查密码是否强。允许自定义要求或评分规则。如果 returnScore 为真,则函数返回密码的整数分数而不是布尔值。 默认选项:

            body('password').isStrongPassword({
              minLength: 8,
              minLowercase: 1,
              minUppercase: 1,
              minNumbers: 1,
              minSymbols: 1,
              returnScore: false,
              pointsPerUnique: 1,
              pointsPerRepeat: 0.5,
              pointsForContainingLower: 10,
              pointsForContainingUpper: 10,
              pointsForContainingNumber: 10,
              pointsForContainingSymbol: 10,
            })
            

            【讨论】:

            • 它的工作!非常感谢。我想更多地了解它,但我找不到文档。你有网址吗?
            • 感谢回复,但我知道那个文档,我的意思是 isStrongPassword 函数的文档。你有吗?
            • 对不起。我不知道任何其他文档。您可以检查源代码并查看测试(如果有)。但我认为我包含的参数应该是不言自明的
            【解决方案8】:

            matches 方法工作,但我认为它对于这个用例来说不是一个稳定的,我认为你应该使用我的代码的 custom() 方法:

            此方法与两个参数一起使用,首先是您的字段集的值,例如 check('name field or password field'),第二个值是包含 req 对象的对象,您可以使用它们并返回如果您的返回值为 true,则为 true 或 false,这没关系,但如果您返回 false,则问题和验证失败。

            我编写不同形状的代码。

            router.post('/adduser', [check('name').isLength({
                min: 2,
                max: 25
            }).withMessage('min character 2 nad max character 25').custom((value, {req}) => {
                return !req.body.name.match(/[^a-zA-Z]/g)
            }).withMessage('please write a correct name'),
                check('family').isLength({
                    min: 2,
                    max: 25
                }).withMessage('min character 2 nad max character 25').custom((value, {req}) => {
                    return !req.body.name.match(/[^a-zA-Z]/g)
                }).withMessage('please write a correct family'),
                check('number').custom((value, {req}) => {
                return !req.body.name.match(/[^a-zA-Z]/g)
            })], (req, res, next) => {
                console.log(validationResult(req).errors)
            })
            

            【讨论】:

              猜你喜欢
              • 2012-09-14
              • 2017-02-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-08-05
              • 1970-01-01
              • 2013-07-11
              • 1970-01-01
              相关资源
              最近更新 更多