我正在使用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");
这不起作用,空密码将被散列而不会出现错误。这当然不能解决密码太长或太短的问题。
答案 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
// ...
});
然而,你似乎确实在这里重新发明轮子。用户名/密码登录已多次完成。依靠现有的广泛依赖于实现可能比尝试推出自己的更好。例如: