Как настроить автоматическое хеширование пароля c в пользовательской модели Sequelize? - PullRequest
0 голосов
/ 03 марта 2020

Прямо сейчас я хэширую пароль в функции маршрута и предоставляю га sh при создании пользователя, но я знаю, что есть способ сделать это через сам Sequelize. Я искал вокруг, но каждый ответ, кажется, устарел или методы никогда не вызывались. Вот мой конфиг:

сервер / модели / пользователь. 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;
};

сервер / 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;

Вот как я сейчас обрабатываю хеширование:

сервер / маршруты / регистр. 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));
          });
        }
      });

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Это сделал трюк:

    ...
    {
      timestamps: false
    }
  );
  User.addHook(
    "beforeCreate",
    user => (user.password = bcrypt.hashSync(user.password, 10))
  );
  return User;
};
0 голосов
/ 03 марта 2020

Пожалуйста, не смешивайте определение вашей модели с бизнесом или логином безопасности c (или другим). В будущем вы можете захотеть изменить библиотеку шифрования или алгоритм хеширования, и вам придется соответственно изменить свою модель. Уровень безопасности должен быть отделен от ваших моделей.

...