写一个eggjs权限验证中间件

2024-06-05 05:58
文章标签 验证 权限 中间件 eggjs

本文主要是介绍写一个eggjs权限验证中间件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于中间件

中间件(Middleware) - 为企业级框架和应用而生
官方文档说的很清楚了,不再叙述。

我们要达到怎么样一个效果?

  1. 用户没有登录不能访问一些特定的页面,比如修改密码、修改资料啊这些敏感操作。如果用户没有登录访问这些页面会自动跳转到登录页面让用户登录。
  2. 如果用户登录过了就可以访问这些页面(验证通过。)
  3. 没有登录可以访问登录页面来进行登陆,或者注册等不需要权限的页面。

如果不使用中间件你会怎么写

在controller/user 修改密码,

async changePassword(){if (this.ctx.session.userId) {  // 如果有这个session// 执行修改密码} else {// 不写就没有响应,会404ctx.redirect('/login');}
}

然后修改资料

async changeUserInfo(){if (this.ctx.session.userId) {  // 如果有这个session// 执行修改资料} else {// 不写就没有响应,会404ctx.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 = '登录失败,账号密码错误';}
}

代码是不是精简清爽多了呢?

注意的几个点,

  1. 要加到config的middleware列表里面:
  config.middleware = [''authLogin'];
  1. await next()要放在最后,这样意味着校验规则会在路由匹配之前执行。
  2. whiteUrl是在config.default.js中的options配置,也可以不要这个,直接使用match或者ignore(相关规则参考官方文档关于中间件这一块)
  config.authLogin = {whiteUrls: ['/test'], // 是使用url的前缀匹配的// 不需要登录的页面,白名单URL// 也可以使用ignore: ['/login', '/register', '/doLogin', '/doRegister']// 使用 match是限制只在这几个页面执行// match和ignore不能同时使用};
  1. 不配置 config.authLogin的话呢?只在特定路由中使用:
  router.get('/login', authLogin, controller.user.login);

这篇关于写一个eggjs权限验证中间件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032255

相关文章

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Python3中Sanic中间件的使用

《Python3中Sanic中间件的使用》Sanic框架中的中间件是一种强大的工具,本文就来介绍Python3中Sanic中间件的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录Sanic 中间件的工作流程中间件的使用1. 全局中间件2. 路由中间件3. 异常处理中间件4. 异步中间件5. 优先级

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

easyui 验证下拉菜单select

validatebox.js中添加以下方法: selectRequired: {validator: function (value) {if (value == "" || value.indexOf('请选择') >= 0 || value.indexOf('全部') >= 0) {return false;}else {return true;}},message: '该下拉框为必选项'}