详解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 相关文章推荐
jQuery中add实现同时选择两个id对象
Oct 22 Javascript
jQuery学习笔记 获取jQuery对象
Sep 19 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
May 07 Javascript
jquery中的$(document).ready()使用小结
Feb 14 Javascript
微信小程序 MINA文件结构
Oct 17 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
js实现漫天星星效果
Jan 19 Javascript
AngularJS读取JSON及XML文件的方法示例
May 25 Javascript
浅谈Postman解决token传参的问题
Mar 31 Javascript
webpack公共组件引用路径简化小技巧
Jun 15 Javascript
17道题让你彻底理解JS中的类型转换
Aug 08 Javascript
微信小程序实现简单的select下拉框
Nov 23 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
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
图解javascript作用域链
2019/05/27 Javascript
详解Vue的七种传值方式
2021/02/08 Vue.js
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[54:26]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第一场 12.10
2020/12/12 DOTA
Python 通过pip安装Django详细介绍
2017/04/28 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
环境工程毕业生自荐信
2013/11/17 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
党章培训心得体会
2014/09/04 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
2015大学生求职信范文
2015/03/20 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
python简单验证码识别的实现过程
2021/06/20 Python