如何在Sequelize的用户模型中设置自动密码散列?

问题描述 投票:0回答:2

现在,我正在对路由函数中的密码进行哈希处理,并在创建用户时提供了哈希值,但是我知道有一种方法可以通过Sequelize本身来进行处理。我已经四处搜寻,但每个答案似乎都已过时,或者从未调用过这些方法。这是我的配置:

服务器/模型/User.js

module.exports = (sequelize, type) => {
  const User = sequelize.define(
    "User",
    {
      user_id: {
        type: type.INTEGER,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
      },
      name: {
        type: type.STRING,
        allowNull: false
      },
      email: {
        type: type.STRING,
        allowNull: false
      },
      password: {
        type: type.STRING,
        allowNull: false
      },
      reg_date: {
        type: type.DATEONLY,
        allowNull: false,
        defaultValue: sequelize.fn("now")
      }
    },
    {
      timestamps: false
    }
  );
  return User;
};

server / config / sequelize.js

const Sequelize = require("sequelize");

const sequelize = new Sequelize(process.env.CLEARDB_DATABASE_URL);

sequelize
  .authenticate()
  .then(() => {
    console.log("Connection has been established successfully.");
  })
  .catch(err => {
    console.error("Unable to connect to the database:", err);
  });

const UserModel = require("../models/User");


const User = UserModel(sequelize, Sequelize);


module.exports = User;

这就是我现在处理哈希的方式:

服务器/路由/register.js

User.findOne({ where: { email: email } }).then(user => {
        if (!user) {
          bcrypt.hash(password, 10, (err, hash) => {
            if (err) throw err;

            User.create({
              name: req.body.name,
              email: email,
              password: hash
            })
              .then(user => {
                return user;
              })
              .catch(err => console.log(err));
          });
        }
      });
node.js sequelize.js bcrypt
2个回答
0
投票

请不要将模型定义与业务或安全逻辑(或其他逻辑)混在一起。将来,您可能需要更改加密库或哈希算法,并且必须相应地更改模型。安全层应与模型分开。


0
投票

这成功了:

    ...
    {
      timestamps: false
    }
  );
  User.addHook(
    "beforeCreate",
    user => (user.password = bcrypt.hashSync(user.password, 10))
  );
  return User;
};
© www.soinside.com 2019 - 2024. All rights reserved.