手记

【金秋打卡】第24天 《Node.js+Koa2+MySQL 打造前后端分离精品项目》

课程名称: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中的修改器是一个道理。理解起来也很容易。


七月老师非常注重在讲编程知识的同时,讲编程思维,讲知识和知识之间的关系。编程是实践性非常强的工作,学习知识最好的方法是放到项目中。做项目的目的不是做项目,最终要做出来自己的项目,业务承载的是编程知识。明天继续刷后边的课程。



0人推荐
随时随地看视频
慕课网APP