本篇文章给大家分享的是有关使用mongoose和bcrypt怎么实现一个用户密码加密功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

使用npm安装即可

npminstall--savebcrypt

用户模型

下面来创建代码用户user的schema,用户名不能重复

varmongoose=require('mongoose'),Schema=mongoose.Schema,bcrypt=require('bcrypt');varUserSchema=newSchema({username:{type:String,required:true,index:{unique:true}},password:{type:String,required:true}});module.exports=mongoose.model('User',UserSchema);

加密

下面加入用户模型的是Mongoose的中间件,该中间件使用pre前置钩子,在密码保存之前,自动地把密码变成hash。详细代码如下

letSALT_WORK_FACTOR=5UserSchema.pre('save',function(next){varuser=this;//产生密码hash当密码有更改的时候(或者是新密码)if(!user.isModified('password'))returnnext();//产生一个saltbcrypt.genSalt(SALT_WORK_FACTOR,function(err,salt){if(err)returnnext(err);//结合salt产生新的hashbcrypt.hash(user.password,salt,function(err,hash){if(err)returnnext(err);//使用hash覆盖明文密码user.password=hash;next();});});});

在node.bcrypt.js中SALT_WORK_FACTOR默认使用的是10,这里设置为5

验证

加密之后,密码原文被替换为密文了。我们无法解密,只能通过bcrypt的compare方法,对再次传入的密码和数据库中保存的加密后的密码进行比较,如果匹配,则登录成功

UserSchema.methods.comparePassword=function(candidatePassword,cb){bcrypt.compare(candidatePassword,this.password,function(err,isMatch){if(err)returncb(err);cb(null,isMatch);});};

把上面的几个步骤串在一起,完整代码如下

varmongoose=require('mongoose'),Schema=mongoose.Schema,bcrypt=require('bcrypt'),SALT_WORK_FACTOR=5;varUserSchema=newSchema({username:{type:String,required:true,index:{unique:true}},password:{type:String,required:true}});UserSchema.pre('save',function(next){varuser=this;//onlyhashthepasswordifithasbeenmodified(orisnew)if(!user.isModified('password'))returnnext();//generateasaltbcrypt.genSalt(SALT_WORK_FACTOR,function(err,salt){if(err)returnnext(err);//hashthepasswordusingournewsaltbcrypt.hash(user.password,salt,function(err,hash){if(err)returnnext(err);//overridethecleartextpasswordwiththehashedoneuser.password=hash;next();});});});UserSchema.methods.comparePassword=function(candidatePassword,cb){bcrypt.compare(candidatePassword,this.password,function(err,isMatch){if(err)returncb(err);cb(null,isMatch);});};module.exports=mongoose.model('User',UserSchema);

测试

把上面的代码保存成user-model.js,然后运行下面代码来实际测试

varmongoose=require('mongoose'),User=require('./user-model');varconnStr='mongodb://localhost:27017/mongoose-bcrypt-test';mongoose.connect(connStr,function(err){if(err)throwerr;console.log('SuccessfullyconnectedtoMongoDB');});//createauseranewuservartestUser=newUser({username:'jmar777',password:'Password123'});//saveusertodatabasetestUser.save(function(err){if(err)throwerr;//fetchuserandtestpasswordverificationUser.findOne({username:'jmar777'},function(err,user){if(err)throwerr;//testamatchingpassworduser.comparePassword('Password123',function(err,isMatch){if(err)throwerr;console.log('Password123:',isMatch);//->Password123:true});//testafailingpassworduser.comparePassword('123Password',function(err,isMatch){if(err)throwerr;console.log('123Password:',isMatch);//->123Password:false});});});

控制台中输入如下数据:

数据库数据如下:

以上就是使用mongoose和bcrypt怎么实现一个用户密码加密功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。