写一个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);
谢谢观看,有什么问题欢迎留言评论,看到尽量会回复。。。
写一个eggjs权限验证中间件的更多相关文章
- nodejs异常处理过程/获取nodejs异常类型/写一个eggjs异常处理中间件
前言 今天想写一下eggjs的自定义异常处理中间件,在写的时候遇到了问题,这个错误我捕获不到类型?? 处理过程,不喜欢看过程的朋友请直接看解决方法和总结 看一下是什么: 抛出的异常是检验失败异常Val ...
- 用GO写一个后台权限管理系统
最近用GO写了一个后台权限管理系统,在WIN10和ubuntu下部署,在win系统下编译ububtu的部署文件要先做如下配置 set GOARCH=amd64 set GOOS=linux go bu ...
- web权限验证方法说明[转载]
前言 本文将会从最基本的一种web权限验证说起,即HTTP Basic authentication,然后是基于cookies和tokens的权限验证,最后则是signatures和一次性密码. HT ...
- 【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能
在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能. 项目是用springMVC+spring+hibernate实现 (和这个没有多大关系) 第一步: 首先 ...
- 【Filter 页面重定向循环】写一个过滤器造成的页面重定向循环的问题
今天做一个过滤器,碰上页面重定向循环的情况: 浏览器的访问路径是:http://192.168.16.104:8080/biologyInfo/login/login/login/login/logi ...
- Struts2 自定义拦截器实例—登陆权限验证
实现一个登陆权限验证的功能 message.jsp: <body> message:${message } </body> login.jsp: <% request.g ...
- .net web api 权限验证
做一个登录权限验证. 开始吧. using System; using System.Collections.Generic; using System.Drawing; using System.D ...
- AngularJS中巧用ngModel的$asyncValidators属性写一个验证唯一性的Direcitve
有这样的一个需求:添加用户的时候,根据主键判断当前添加用户的email是否已经被使用. 为此,我们需要把主键和email来传递给远程的一个API,让API返回结果,告之当前email是否被使用过. 写 ...
- ########django-基于中间件写一个限制频繁登陆########
django-基于中间件写一个限制频繁登陆 额额,标题已经很醒目了,通过中间件去实现,其他方法也可以实现 浏览器前端传来的请求,必须通过中间件,才能到后面路由,视图函数,所以我们在中间件那里做一层处理 ...
随机推荐
- 【转载】 C#中ArrayList集合类的使用
在C#的集合操作过程中,我们一般常用的集合类为List集合,List集合是一种强类型的泛型集合,其实还有一个ArrayList集合类,ArrayList集合类则非泛型类的集合,并且ArrayList集 ...
- 47、安装node-sass后运行报错
vue安装node-sass编译报错安装node-scss报错安装node-scss报错在搭建vue脚手架 或者是在vue项目中,想使用sass的功能, npm install node-sass - ...
- 面试题:什么叫平衡二叉查找树--AVL树
查找.插入和删除在平均和最坏情况下都是O(log n) 增加和删除可能需要通过一次或多次树旋转来重新平衡这个树 节点的平衡因子是它的左子树的高度减去它的右子树的高度.带有平衡因子 1.0 或 -1 的 ...
- ApplicationContext的名称解释
如果说BeanFactory是Spring的心脏,那么Application就是完整的身躯.ApplicationContext就是由BeanFactory派生出来的. 1.ApplicationCo ...
- Linux怎么部署docker
Docker安装 建议在linux环境下安装Docker,window环境搭建比较复杂且容易出错,使用Centos7+yum来安装Docker环境很方便. Docker 软件包已经包括在默认的 Cen ...
- DT添加七牛云对象存储插件功能
七牛云对象存储 1.注意客户购买的空间的存储区域,区域不同对应的上传域名不同 destoon 七牛云上传文件 用下面源码替换include/ftp.class.php 文件代码 &l ...
- php解析xml的几种方式
php提供几种解析xml的类或方法,包括:Xml parser. SimpleXML,.XMLReader,.DOMDocument. XML Expat Parser: XML Parser使用Ex ...
- pm2日志管理插件
pm2的日志模块默认是每一个服务进程都分配两个默认的日志文件 普通日志 错误日志 这两个日志文件存放于/root/.pm2/logs中,如果pm2管理5个服务,那么该文件夹下总共有10个日志文件,并且 ...
- spark的RDDAPI总结
下面是RDD的基础操作API介绍: 操作类型 函数名 作用 转化操作 map() 参数是函数,函数应用于RDD每一个元素,返回值是新的RDD flatMap() 参数是函数,函数应用于RDD每一个元素 ...
- CSP2019心路历程
--人常说无论做什么都不要忘了初心,但如果一个人从来没有"应该"去忘了初心,又从何谈起的初心. CSP开考前,风吹在脸上,一些淡淡的回忆化作影子碎在地上:是到了一个令人感伤的路口了 ...