Mongodb Mongoose自定义密码验证

Mongodb Mongoose自定义密码验证,mongodb,mongoose,Mongodb,Mongoose,我正在尝试使用mongoose创建模式,并陷入了如何对密码应用自定义验证的问题,其中密码包含: 一个特殊的角色 密码应该有一个小写和一个大写字符 密码长度应大于6 以下是模式: const mongoose = require('../db/mongoose'); const validator = require('validator'); const UserSchema = new mongoose.Schema({ email: { type: String

我正在尝试使用mongoose创建模式,并陷入了如何对密码应用自定义验证的问题,其中密码包含:

  • 一个特殊的角色

  • 密码应该有一个小写和一个大写字符

  • 密码长度应大于6

以下是模式:

const mongoose = require('../db/mongoose');
const validator = require('validator');

const UserSchema = new mongoose.Schema({
    email: {
        type: String,
        validate: {
            validator: validator.isEmail()
        }
    },
    password: {
        type: String,
        minlength: 6,
    }
});

谢谢

您需要使用
验证程序
功能传递
密码
验证属性

password: {
  type: String,
  validate: {
    validator: isValidPassword,
    message: 'Password must be... '
  }
}
我创建了这个
mongoose定制验证器
模块,并考虑了这些需求。从本模块中查看
isValidPassword
验证程序。文件应详细说明使用方法


由于您不应该在数据库中保存普通密码,因此在数据库中验证密码是没有意义的。因为你应该先散列密码然后保存它。哈希密码将是一个复杂的字符串,最有可能通过验证保存在数据库中

因此,您必须在客户端验证密码。为此,您可以使用joi npm包

这就是如何实现它的方法

userModel.js//应位于models文件夹中

 const Joi = require('@hapi/joi');
 const mongoose = require("mongoose");

 //you defined your schema above, it should be **lowercase** 
 //here is the model, model should start capital letter 
 const User=mongoose.model("User",userSchema)

function validateUser(user) {
  const schema = Joi.object().keys({
    email: Joi.string()
      .min(8)
      .max(50)
      .required()
      .email(),
    password: Joi.string()
      .min(6)
      .required()
      .max(20)
      .regex(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,1024}$/) //special/number/capital
  });
  return Joi.validate(user, schema);
}

module.exports.User = User;
module.exports.validate = validateUser;
我将演示如何在post路由器中使用此功能

userRoute.js

//import model and validate func
const { User, validate } = require("/models/user"); 

router.post("/", async (req, res) => {
  //validating the request here
  const { error } = validate(req.body);
  if (error) res.status(400).send(error.details[0].message);

  //i used this code to show you how to use validate function
  //i am not sure what is your project about
  });

公平地说,密码不应保存为明文,但最好将密码处理尽可能靠近数据源。由于他已经在使用mongoose模型,一个有效的建议是使用中间件将明文密码转换为强密码表示。这将阻止使用该模型的应用程序推出自己的密码哈希实现。