写一个eggjs权限验证中间件
时间:2019-07-04
本文章向大家介绍写一个eggjs权限验证中间件,主要包括写一个eggjs权限验证中间件使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
关于中间件
https://eggjs.org/zh-cn/basics/middleware.html
官方文档说的很清楚了,不再叙述。
我们要达到怎么样一个效果?
- 用户没有登录不能访问一些特定的页面,比如修改密码、修改资料啊这些敏感操作。如果用户没有登录访问这些页面会自动跳转到登录页面让用户登录。
- 如果用户登录过了就可以访问这些页面(验证通过。)
- 没有登录可以访问登录页面来进行登陆,或者注册等不需要权限的页面。
如果不使用中间件你会怎么写
在controller/user 修改密码,
async changePassword(){
if (this.ctx.session.userId) { // 如果有这个session
// 执行修改密码
} else {
// 不写就没有响应,会404
ctx.redirect('/login');
}
}
然后修改资料
async changeUserInfo(){
if (this.ctx.session.userId) { // 如果有这个session
// 执行修改资料
} else {
// 不写就没有响应,会404
ctx.redirect('/login');
}
}
然后登录就不用判断
async login(){
let {userName, password} = this.ctx.request,body;
// 校验密码
let userFind = this.service.findOne({userName, password});
// 获取user信息
if (userFind) {
this.ctx.session.userId = userFind._id;
// 返回成功
this.ctx.body = '登录成功';
} else {
this.ctx.body = '登录失败,账号密码错误';
}
}
这样如果代码量小的话也能接受,但是如果将来接口越来越多,需要检验权限的地方也越来越多,修改就会很麻烦。
剥离出来,自成体系
在app/middleware下面新建authLogin.js文件用来判断是否登录
module.exports = (options, app) => {
return async function testMiddleware(ctx, next) {
let whiteUrls = options.whiteUrls || [];
// 如果ctx.url在白名单中
let isWhiteUrl = whiteUrls.some((whiteUrl)=> ctx.url.startsWith(whiteUrl));
if (! isWhiteUrl) {
console.log('authLogin');
if (! ctx.session.userId) {
ctx.redirect('/login'); // 让用户去登录
}
else {
console.log('auth ok');
await next();
}
} else {
// 白名单
console.log('white url');
await next();
}
};
};
在controller/user 修改密码,
async changePassword(){
//不需要判断,直接执行修改密码
}
然后修改资料
async changeUserInfo(){
//不需要判断,直接执行修改资料
}
然后登录还是一样
async login(){
let {userName, password} = this.ctx.request,body;
// 校验密码
let userFind = this.service.findOne({userName, password});
// 获取user信息
if (userFind) {
this.ctx.session.userId = userFind._id;
// 返回成功
this.ctx.body = '登录成功';
} else {
this.ctx.body = '登录失败,账号密码错误';
}
}
代码是不是精简清爽多了呢?
注意的几个点,
- 要加到config的middleware列表里面:
config.middleware = [''authLogin'];
- await next()要放在最后,这样意味着校验规则会在路由匹配之前执行。
- whiteUrl是在config.default.js中的options配置,也可以不要这个,直接使用match或者ignore(相关规则参考官方文档关于中间件这一块)
config.authLogin = {
whiteUrls: ['/test'], // 是使用url的前缀匹配的
// 不需要登录的页面,白名单URL
// 也可以使用
ignore: ['/login', '/register', '/doLogin', '/doRegister']
// 使用 match是限制只在这几个页面执行
// match和ignore不能同时使用
};
- 不配置 config.authLogin的话呢?只在特定路由中使用:
router.get('/login', authLogin, controller.user.login);
谢谢观看,有什么问题欢迎留言评论,看到尽量会回复。。。
原文地址:https://www.cnblogs.com/hengyumo/p/11134621.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 进程间通信的方式(2)
- AkShare-股票数据-机构持股
- View的滑动方式 详细介绍
- AkShare-期货数据-分时数据
- Python 爬取留言板留言(三):多进程版+selenium模拟
- View事件分发、滑动冲突 详解
- Python Django开发 异常及其解决办法(一)
- 带你彻底搞懂-View的工作原理!
- Python 批量下载BiliBili视频 打包成软件
- 必要掌握!Window、WindowManager !
- 面试必备:ThreadLocal+Looper+Handler
- 子线程 真的不能更新UI ?
- Web前端开发 HTML设计 经验与技巧总结
- [OHIF-Viewers]医疗数字阅片-医学影像-辅助工具-Redux DevTools-DevTools for Redux with hot reloading, action replay,
- 全面理解:Android中的线程及线程池