自定义验证器无法检查空密码

时间:2015-06-06 19:21:14

标签: node.js express mongoose bcrypt

我正在使用bcrypt来散列用户的密码。因此我有以下界面:

app.post("/user", function(req, res, next) {
    // hash the password asynchronously
    bcrypt.hash(req.body.password, null, null, function(err, hash) {
        var newUser = new User({
            username: req.body.username,
            password: hash,
            email: req.body.email
        });
        newUser.validate(function (err) {
            if (err) {
                logger.info("User registration aborted: " + err.toString());
                return res.status(400).json(err);
            } else {
                newUser.save(function (err, user) {
                    if (err) {
                        return res.status(500).json(err);
                    } else {
                        console.log(user.username + " saved succesfully.");
                        logger.info("User " + user._id + " registered.");
                        return res.json(user);
                    }
                });
            }
        });
    });
});

用户可以输入一个空密码(""),也会进行哈希处理。我不希望用户能够创建短于x且长于y字符的密码。因此,我想使用自定义验证器来中止:

UserSchema.path("password").validate(function (value) {
    bcrypt.compare("", value, function(err, equal) {
        console.log(this.username + ": " + value + ", " + equal);
        return !equal;
    });
}, "password empty");

这不起作用,空密码将被散列而不会出现错误。这当然不能解决密码太长或太短的问题。

1 个答案:

答案 0 :(得分:1)

您不会将明文密码存储在mongoDB中,因此您无法在UserSchema验证过程中强制执行密码长度策略。你需要在进入哈希/猫鼬之前做这件事。像这样的东西:

app.post("/user", function(req, res, next) {
    var pw = req.body.password;
    if (!pw || pw.length > max || pw.length < min) {
        return res.status(400).send('Password is required and must be > x and < y...');
    }

    // hash the password asynchronously
    // ...
});

然而,你似乎确实在这里重新发明轮子。用户名/密码登录已多次完成。依靠现有的广泛依赖于实现可能比尝试推出自己的更好。例如:

https://www.npmjs.com/package/passport-local