详解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 相关文章推荐
用户注册常用javascript代码
Aug 29 Javascript
js压缩工具 yuicompressor 使用教程
Mar 31 Javascript
Jquery提交表单 Form.js官方插件介绍
Mar 01 Javascript
js完美的div拖拽实例代码
Jan 22 Javascript
IE浏览器不支持getElementsByClassName的解决方法
Aug 27 Javascript
分享十五款 jQuery 社交网络分享插件
May 16 Javascript
JQuery悬停控制图片轮播——代码简单
Aug 05 Javascript
谷歌Chrome浏览器扩展程序开发小记
Jan 06 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 Javascript
Angular2学习笔记——详解NgModule模块
Dec 02 Javascript
JS实现的DOM插入节点操作示例
Apr 04 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
Feb 25 Vue.js
使用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
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
2012/03/26 PHP
php实现json编码的方法
2015/07/30 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
JavaScript获取网页表单提交方式的方法
2015/04/02 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
Python对象类型及其运算方法(详解)
2017/07/05 Python
django模板语法学习之include示例详解
2017/12/17 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
Python可以用来做什么
2020/11/23 Python
Python 中Operator模块的使用
2021/01/30 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
实习自我鉴定模板
2013/09/28 职场文书
技术人员面试提纲
2013/11/28 职场文书
新浪微博实习心得体会
2014/01/27 职场文书
假面舞会策划方案
2014/05/29 职场文书
毕业生应聘求职信
2014/07/10 职场文书
护理心得体会范文
2016/01/22 职场文书