Open deligent-ant opened 6 years ago
登录用户的信息存与mysql,mysql上的操作基于objection做了一下封装,把对应的数据库表操作方法挂在fastify的sever实列上,用户是否已经登录通过cookie实现,只是cookie上存储的只是用户信息的一个映射key,也就是sessionId,通过sessionId作索引,在mysql上匹配到对应的用户信息。 实现步骤
登录用户的信息存与mysql,mysql上的操作基于objection做了一下封装,把对应的数据库表操作方法挂在fastify的sever实列上,用户是否已经登录通过cookie实现,只是cookie上存储的只是用户信息的一个映射key,也就是sessionId,通过sessionId作索引,在mysql上匹配到对应的用户信息。
'use strict' //用户名要唯一 const fp = require('fastify-plugin') const uid = require('uid-safe').sync const sessionPlugin = async (app, options) => { let sessionIdName = options.sessionName || 'sessionId_stock_level2' let userModel = await app.getQueryModel({ psm: '11111111', table: '222222' }) let sessionModel = await app.getQueryModel({ psm: '33333333', table: '4444444444' }) app.addHook('preHandler', async (req, reply) => { const sessionId = req.cookies[sessionIdName] if (sessionId) { const r = await sessionModel .query() .where({ sessionId }) .andWhere('expires', '<', new Date()) .catch(err => err) if (Array.isArray(r) && r.length > 0) { req.session = r[0] } } }) app.post('/login', async (req, reply) => { let { body } = req let name = body.name let password = body.password const userName = await userModel .query() .where('name', name) .catch(err => console.log(err)) if (userName.length === 0) { return { code: 1, data: '用户名输入错误!' } } else { const userPassword = await userModel.query().where({ name, password }) if (userPassword.length === 0) { return { code: 1, data: '密码输入错误!' } } else { const sessionId = uid(24) let maxAge = options.maxAge || 60 * 60 * 1000 let expires = new Date(Date.now() + maxAge) let resInsert = await sessionModel .query() .insert({ sessionId, expires, name }) .catch(err => err) reply .setCookie(sessionIdName, sessionId, { domain: '', path: '/', expires: new Date(expires), httpOnly: true }) .send({ code: 0, data: '登陆成功!' }) } } }) } module.exports = fp(sessionPlugin, { fastify: '>=1.2.0', name: '@fe/byted-auth' })
附上一个基于json ,而非mysql的简单实现 'use strict' //用户名要唯一
附上一个基于json ,而非mysql的简单实现
'use strict' //用户名要唯一
const fp = require('fastify-plugin') const sessionPlugin = async (app, options = {}) => { // console.log(app.CONFIG) let maxAge = options.maxAge || 24 60 60 * 100 let sessionIdName = options.sessionName || 'sessionId_stock_level2' const { WHITELIST } = app.CONFIG
app.addHook('preHandler', async (req, reply) => { const sessionId = req.cookies[sessionIdName] if (sessionId) { let userInfos = {} let time = new Date() const isAvaiable = WHITELIST.some(item => { if ( item.sessionId === sessionId && item.expires < time && item.group === 'SZ' ) { userInfos = item return true } return false }) if (isAvaiable) { req.session = userInfos } else { req.session = null } } })
app.post('/szlevel2/login', async (req, reply) => { let expires = new Date(Date.now() + maxAge) let sessionId = '' let { body } = req let name = body.name let password = body.password const isAvaiable = WHITELIST.some(item => { if ( item.name === name && item.password === password && item.group === 'SZ' ) { sessionId = item.sessionId return true } return false }) if (isAvaiable) { reply .setCookie(sessionIdName, sessionId, { domain: '', expires: new Date(expires), httpOnly: true }) .send({ code: 0, data: { name, message: '登陆成功' } }) } else { reply.send({ code: 1, data: '输入错误!' }) } })
app.post('/szlevel2/logout', async (req, reply) => { reply .setCookie(sessionIdName, '') .send({ code: 0, data: 'logout success!' }) }) }
module.exports = fp(sessionPlugin, { fastify: '>=1.2.0', name: '@fe/byted-auth' })
session实现登录与登出的简单实现
简单代码如下:
const fp = require('fastify-plugin') const sessionPlugin = async (app, options = {}) => { // console.log(app.CONFIG) let maxAge = options.maxAge || 24 60 60 * 100 let sessionIdName = options.sessionName || 'sessionId_stock_level2' const { WHITELIST } = app.CONFIG
app.addHook('preHandler', async (req, reply) => { const sessionId = req.cookies[sessionIdName] if (sessionId) { let userInfos = {} let time = new Date() const isAvaiable = WHITELIST.some(item => { if ( item.sessionId === sessionId && item.expires < time && item.group === 'SZ' ) { userInfos = item return true } return false }) if (isAvaiable) { req.session = userInfos } else { req.session = null } } })
app.post('/szlevel2/login', async (req, reply) => { let expires = new Date(Date.now() + maxAge) let sessionId = '' let { body } = req let name = body.name let password = body.password const isAvaiable = WHITELIST.some(item => { if ( item.name === name && item.password === password && item.group === 'SZ' ) { sessionId = item.sessionId return true } return false }) if (isAvaiable) { reply .setCookie(sessionIdName, sessionId, { domain: '', expires: new Date(expires), httpOnly: true }) .send({ code: 0, data: { name, message: '登陆成功' } }) } else { reply.send({ code: 1, data: '输入错误!' }) } })
app.post('/szlevel2/logout', async (req, reply) => { reply .setCookie(sessionIdName, '') .send({ code: 0, data: 'logout success!' }) }) }
module.exports = fp(sessionPlugin, { fastify: '>=1.2.0', name: '@fe/byted-auth' })