课程名称:Node.js+Koa2+MySQL打造前后端分离精品项目《旧岛》
课程章节:第6章 【构建用户身份系统】通用用户系统与小程序用户系统
视频:6-2 中间件只在应用程序启动时初始化一次
6-3 盐与密码加密的小知识
6-4 模型的set操作
课程讲师: 七月
课程内容:
6-2 中间件只在应用程序启动时初始化一次
中间件是静态的方式。目前的情况是把校验器编写成为一个类。每一次都是实例化这个类,如果有十个请求,会实例化十次。如果用中间件的形式编写,仅仅会在Koa项目启动的时候new一次,并不会每一次请求都启动。这样全局只有一个validator,会造成数据错乱。目前的方式,每个validator互相不会干扰。
结论就是,在中间件的地方,不要轻易的用类的形式注册中间件。 如果是函数,就不会出现这个问题。
6-3 盐与密码加密的小知识
密码用明文的方式存储在数据库中,不安全。必须进行加密处理。可以借助第三方的库实现。
const bcrypt = require('bcryptjs') const Router = require('koa-router') const { RegisterValidator } = require('../../validator/validator') const { User } = require('../../models/user') const router = new Router({ prefix: '/v1/user' }) //注册 router.post('/register', async (ctx) => { //接收参数->校验参数 console.log(ctx) const v = new RegisterValidator().validate(ctx) const salt = bcrypt.genSaltSync(10) //10表示生成‘盐’的成本, 生成盐的成本越高,安全性越高。 const psw = bcrypt.hashSync(v.get('body.password1'), salt) //目前的情况是 初始密码相同,盐不同,加密之后的密码也不同。 可以抵御彩虹攻击 console.log(v) const user = { email: v.get('body.email'), password: psw, nickname: v.get('body.nickname') } const r = await User.create(user) }) module.exports = router
6-4 模型的set操作
这里的set操作,和ThinkPHP中的修改器是相同的设计,很好理解。以下代码演示了set操作。
const bcrypt = require('bcryptjs') const { sequelize } = require('../../core/db') const { Sequelize, Model } = require('sequelize') class User extends Model { } User.init({ id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, nickname: Sequelize.STRING, email: { type: Sequelize.STRING(128), unique: true }, password: { type: Sequelize.STRING, set(val) { const salt = bcrypt.genSaltSync(10) //10表示生成‘盐’的成本, 生成盐的成本越高,安全性越高。 const psw = bcrypt.hashSync(v.get('body.password1'), salt) this.setDataValue('password', psw) } }, openid: { type: Sequelize.STRING(64), unique: true }, test: Sequelize.STRING }, { sequelize, tableName: 'user' }) module.exports = { User }
课程收获:
这两节课讲了密码在数据库中不能用明文存储,以及如何给密码加盐,因为这是web编程的最基础知识。且在其他的项目中用其他的语言已经这么做了。所以这里的逻辑,理解的很清楚透彻。讲set操作的时候,set和ThinkPHP中的修改器是一个道理。理解起来也很容易。
七月老师非常注重在讲编程知识的同时,讲编程思维,讲知识和知识之间的关系。编程是实践性非常强的工作,学习知识最好的方法是放到项目中。做项目的目的不是做项目,最终要做出来自己的项目,业务承载的是编程知识。明天继续刷后边的课程。