写一个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

相关文章

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后