当前位置:  开发笔记 > 编程语言 > 正文

使用BCrypt和Sequelize Model

如何解决《使用BCrypt和SequelizeModel》经验,为你挑选了3个好方法。



1> Louay Alakka..:

方法应该在"选项"参数中提供sequelize.define

const bcrypt = require("bcrypt");

module.exports = function(sequelize, DataTypes) {
    const User = sequelize.define('users', {
        annotation_id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true
        },
        firstName: {
            type: DataTypes.DATE,
            field: 'first_name'
        },
        lastName: {
            type: DataTypes.DATE,
            field: 'last_name'
        },
        email: DataTypes.STRING,
        password: DataTypes.STRING
    }, {
        freezeTableName: true,
        instanceMethods: {
            generateHash(password) {
                return bcrypt.hash(password, bcrypt.genSaltSync(8));
            },
            validPassword(password) {
                return bcrypt.compare(password, this.password);
            }
        }
    });

    return User;
}


看起来重要的是要注意你在这里使用的Sequelize版本(3 vs 4).在v4中,有一种在模型上定义实例方法的新方法:http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html#breaking-changes

2> alditis..:

其他替代方法:使用hook和bcrypt异步模式

User.beforeCreate((user, options) => {

    return bcrypt.hash(user.password, 10)
        .then(hash => {
            user.password = hash;
        })
        .catch(err => { 
            throw new Error(); 
        });
});



3> user1274820..:

那里有一个教程,介绍如何使用钩子和bcrypt来获得sequelize / postgreSQL身份验证系统。

编写本教程的人没有使用异步哈希/盐方法;在用户创建/实例方法部分中,他使用了以下代码:

hooks: {
  beforeCreate: (user) => {
    const salt = bcrypt.genSaltSync();
    user.password = bcrypt.hashSync(user.password, salt);
  }
},
instanceMethods: {
  validPassword: function(password) {
    return bcrypt.compareSync(password, this.password);
  }
}    

较新版本的Sequelize不喜欢以这种方式声明实例方法-并且许多人已经解释了如何解决此问题(包括在原始教程中发布的人):

原始注释使用同步方法:

User.prototype.validPassword = function (password) {
    return bcrypt.compareSync(password, this.password);
};

使这些功能异步所需要做的就是:

异步beforeCreate bcrypt genSalt和genHash函数:

beforeCreate: async function(user) {
    const salt = await bcrypt.genSalt(10); //whatever number you want
    user.password = await bcrypt.hash(user.password, salt);
}

User.prototype.validPassword = async function(password) {
    return await bcrypt.compare(password, this.password);
}

在您检查密码的登录路径中的node.js应用程序上,有一个findOne部分:

User.findOne({ where: { username: username } }).then(function (user) {
    if (!user) {
        res.redirect('/login');
    } else if (!user.validPassword(password)) {
        res.redirect('/login');
    } else {
        req.session.user = user.dataValues;
        res.redirect('/dashboard');
    }
});

您在这里要做的就是添加单词asyncawait

User.findOne({ where: { username: username } }).then(async function (user) {
    if (!user) {
        res.redirect('/login');
    } else if (!await user.validPassword(password)) {
        res.redirect('/login');
    } else {
        req.session.user = user.dataValues;
        res.redirect('/dashboard');
    }
});

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有