为啥选择Bcrypt
Bcrypt 有两个特点
-
每一次 HASH 出来的值不一样
-
计算非常缓慢
因此使用 Bcrypt 进行加密后,攻击者想要使用算出 M2 成本变得不可接受。但代价是应用自身也会性能受到影响,不过登录行为并不是随时在发生,因此能够忍受。对于攻击者来说,需要不断计算,让攻击变得不太可能。
1.安装
npm i bcrypt
2.使用,初始化一个node服务器,开启mongodb,项目文件为server
1.创建models/AdminUser.js文件,使用bcrypt模块
const mongoose = require('mongoose')
const schema = new mongoose.Schema({
name: {
type: String
},
password: {
type: String,
//set函数是对保存该字段时对值进行修改,传入参数为字段内容
set (val) {
//hashSync()第一个参数为需要加密的内容,第二个参数是加密后的字段
return require('bcrypt').hashSync(val, 10)
}
}
})
module.exports = mongoose.model('AdminUser', schema)
2.需要保存的地址,创建plugins/db.js文件
module.exports= app => {
const mongoose = require('mongoose')
//localhost:27017是本地数据库地址,node-vue-moba是总名字
const database_name = 'mongodb://localhost:27017/node-vue-moba'
mongoose.connect(database_name, {
userNewUrlParser: true
})
}
3.修改index.js文件
//引入express模块
const express = require('express')
// 实例化
const app = express()
app.use(require('cors')())
app.use(express.json())
// 引入db.js,并使用app函数
require('./plugins/db')(app)
//导入admin,并使用里面的app的函数
require('./routes/admin')(app)
// 接口
app.listen(3000, () => {
console.log('http://localhost:3000')
})
4.创建routes/admin/index.js文件
// 后台管理系统路由
module.exports = app => {
const express = require('express')
// 挂载路由
const router = express.Router({
mergeParams: true
})
//写post接口
router.post('/', async (req, res) => {
console.log(req.body + '增')
const model = await req.Model.create(req.body)
console.log(model)
res.send(model)
})
//查询分类列表
router.get('/', async (req, res) => {
//每页条数
const limit = parseInt(req.query.limit)
//跳过的条数
const skip = (req.query.page - 1) * limit
if (limit) {
//查询内容,//分页搜索
const model = await req.Model.find().skip(skip).limit(limit)
//查询总数
const total = await req.Model.find().count()
res.send({
data: model,
total: total
})
}
})
//根据分类id查找
router.get('/:id', async (req, res) => {
const model = await req.Model.findById(req.params.id)
res.send(model)
})
//根据分类id修改
router.put('/:id', async (req, res) => {
await req.Model.findByIdAndUpdate(req.params.id, req.body)
res.send({
success: true
})
})
//删除分类
router.delete('/:id', async (req, res) => {
const model = await req.Model.findByIdAndDelete(req.params.id,req.body)
res.send(model)
})
app.use('/admin/api/rest/:resource', async(req, res, next) => {
//统一设置 inflection是安装包,进行类名大小写转换,req.params.resource是客户端api接口rest/后面的参数
//这样可以进行多个模板的套用
const modelName = require('inflection').classify(req.params.resource)
console.log(modelName)
req.Model = require(`../../models/${modelName}`)
next()
}, router)
}