详解nuxt路由鉴权(express模板)


Posted in Javascript onNovember 21, 2018

这里我们以用户登录鉴权为例

express依赖express-session中间件实现session功能

若我们不加载express-session组件

router.get('/user/login', function (req, res) {
 console.log(req,req.session)
})

会发现不存在session对象

引入express-session组件

// server/index.js文件
...
import session from 'express-session'
...
app.use(session)
...

然后再试试

router.get('/user/login', function (req, res) {
 console.log(req.session)
})

这时可以看到打印出空数组对象。。。好了,下面就可以使用了

import {Router} from 'express'
const router = Router()
import request from 'superagent'
router.get('/user/login', function (req, res) {
  request
   .get(path)
   .query(req.query)
   .set('Content-Type', 'application/json;charset=UTF-8')
   .end((err, _res) => {
    if (_res.body.code === 200) {
     req.session.authUser = _res.body.data //将返回的用户数据存到session
    }
    res.json(_res.body)
   })
}

seeesion搞定了,怎么进行鉴权呢?

首先,将用户session保存到store,以便全局取用
nuxtServerInit 方法:如果在状态树中指定了 nuxtServerInit 方法,Nuxt.js 调用它的时候会将页面的上下文对象作为第2个参数传给它(服务端调用时才会酱紫哟)。当我们想将服务端的一些数据传到客户端时,这个方法是灰常好用的。

举个例子,假设我们服务端的会话状态树里可以通过 req.session.user 来访问当前登录的用户。将该登录用户信息传给客户端的状态树,我们只需更新 store/index.js 如下:

actions: {
 nuxtServerInit ({ commit }, { req }) {
  if (req.session.user) {
   commit('user', req.session.user)
  }
 }
}

这样我们就可以通过判断store中user的状态来知道用户是否登录。

在跳转时需要鉴权的页面添加中间件:

export default{
  middleware: auth
}

auth.js

export default function ({store,redirect}) {
 if (!store.state.authUser) {
    return redirect('/user/login')
  }
}

大概流程:a?>b middleware鉴权未登录,跳转登录页面登录,调用登录接口保存用户session,返回a,再次跳转b,nuxtServerInit 从上下文对象中获取session保存在store,鉴权成功,跳转成功。

拓展:connect-redis

sever/index配置

import express from 'express'
import {
 Nuxt,
 Builder
} from 'nuxt'
import session from 'express-session'
import redis from 'connect-redis'
import bodyParser from 'body-parser'
import api from './api'
import serverConfig from './config' //redis配置文件

const app = express()
const host = process.env.HOST || '127.0.0.1'
const port = process.env.PORT || 3000

const RedisStore = redis(session)
app.use(bodyParser.json())

app.use('/static', express.static('static'))

app.use(session({
 name: 'sid',
 secret: 'Asecret123-',
 resave: true,
 rolling: true,
 saveUninitialized: false,
 store: new RedisStore(serverConfig)
}))

app.set('port', port)

// Import API Routes
app.use('/api', api)

app.use('/', api)

// Import and Set Nuxt.js options
let config = require('../nuxt.config.js')
config.dev = !(process.env.NODE_ENV === 'production')

// Init Nuxt.js
const nuxt = new Nuxt(config)

// Build only in dev mode
if (config.dev) {
 const builder = new Builder(nuxt)
 builder.build()
}

// Give nuxt middleware to express
app.use(nuxt.render)

// Listen the server
app.listen(port, host)
console.log('Server listening on ' + host + ':' + port) // eslint-disable-line no-console

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS模拟多线程
Feb 07 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
May 10 Javascript
前后台交互过程中json格式如何解析以及如何生成
Dec 26 Javascript
jQuery实现瀑布流布局
Dec 12 Javascript
JS弹出可拖拽可关闭的div层完整实例
Feb 13 Javascript
轻松掌握JavaScript装饰者模式
Aug 27 Javascript
jQuery的extend方法【三种】
Dec 14 Javascript
详解handlebars+require基本使用方法
Dec 21 Javascript
Vue组件间通信 Vuex的用法解析
Aug 05 Javascript
详解mpvue开发微信小程序基础知识
Sep 23 Javascript
JS删除数组指定值常用方法详解
Jun 04 Javascript
小程序实现tab标签页
Nov 16 Javascript
使用vue-cli webpack 快速搭建项目的代码
Nov 21 #Javascript
Angular刷新当前页面的实现方法
Nov 21 #Javascript
详解ES6系列之私有变量的实现
Nov 21 #Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 #jQuery
Vue.js 中 axios 跨域访问错误问题及解决方法
Nov 21 #Javascript
vue  directive定义全局和局部指令及指令简写
Nov 20 #Javascript
详解Vue.js在页面加载时执行某个方法
Nov 20 #Javascript
You might like
第二节 对象模型 [2]
2006/10/09 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
php多线程并发实现方法
2016/09/30 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
用JavaScript调用WebService的示例
2008/04/07 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
JS实现页面打印功能
2017/03/16 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
JS实现多功能计算器
2020/10/28 Javascript
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
python实现百度关键词排名查询
2014/03/30 Python
Python3实现生成随机密码的方法
2014/08/23 Python
python logging类库使用例子
2014/11/22 Python
Python中 map()函数的用法详解
2018/07/10 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
接受捐赠答谢词
2014/01/27 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
Django实现翻页的示例代码
2021/05/24 Python