当前位置: 首页 > news >正文

cool Node后端 中实现中间件的书写

1.需求

在node后端中,想实现一个专门鉴权的文件配置,可以这样来解释 就是 有些接口需要token调用接口,有些接口不需要使用token 调用 

这期来详细说明一下

     什么是中间件中间件顾名思义是指在请求和响应中间,进行请求数据的拦截处理,数据校验,并且进行逻辑处理后判断是否允许进入下一个中间件。中间件分为前缀中间件,后置中间件。可以用于权限认证。日志记录等

2.cool 中的中间件

cool 官方的说明文档

控制器(Controller) | COOL官网

3.用户鉴权问题

import { App, Config, Inject, Middleware } from '@midwayjs/decorator';
import * as _ from 'lodash';
import { RESCODE } from '@cool-midway/core';
import * as jwt from 'jsonwebtoken';
import { NextFunction, Context } from '@midwayjs/koa';
import { IMiddleware, IMidwayApplication } from '@midwayjs/core';
import { CacheManager } from '@midwayjs/cache';/*** 权限校验*/
@Middleware()
export class BusinessAuthorityMiddlewareimplements IMiddleware<Context, NextFunction>
{@Config('koa.globalPrefix')prefix;@Config('module.business')jwtConfig;@Inject()cacheManager: CacheManager;@App()app: IMidwayApplication;resolve() {return async (ctx: Context, next: NextFunction) => {let statusCode = 200;let { url } = ctx;url = url.replace(this.prefix, '');const token = ctx.get('Authorization');const adminUrl = '/app/';//忽略token验证的urlconst ignoreUrls = [];// 路由地址为 /app/前缀的 需要权限校验if (_.startsWith(url, adminUrl)) {try {ctx.admin = jwt.verify(token, this.jwtConfig.jwt.secret);} catch (err) {}// 不需要登录 无需权限校验if (new RegExp(`^${adminUrl}?.*/open/`).test(url) ||ignoreUrls.includes(url)) {await next();return;}if (ctx.admin) {const rToken = await this.cacheManager.get(`business:token:${ctx.admin.userId}`);// 要登录每个人都有权限的接口if (new RegExp(`^${adminUrl}?.*/comm/`).test(url)) {await next();return;}// 如果传的token是refreshToken则校验失败if (ctx.admin.isRefresh) {ctx.status = 401;ctx.body = {code: RESCODE.COMMFAIL,message: '(1)登录失效~',};return;}// 判断密码版本是否正确const passwordV = await this.cacheManager.get(`business:passwordVersion:${ctx.admin.userId}`);if (passwordV != ctx.admin.passwordVersion) {ctx.status = 401;ctx.body = {code: RESCODE.COMMFAIL,message: '(2)登录失效~',};return;}if (!rToken) {ctx.status = 401;ctx.body = {code: RESCODE.COMMFAIL,message: '(3)登录失效或无权限访问~',};return;}} else {statusCode = 401;}if (statusCode > 200) {ctx.status = statusCode;ctx.body = {code: RESCODE.COMMFAIL,message: '(4)登录失效或无权限访问~',};return;}}await next();};}
}

http://www.lryc.cn/news/301748.html

相关文章:

  • Leecode之面试题消失的数字
  • STM32的三种下载方式
  • 华为 huawei 交换机 接口 MAC 地址学习限制接入用户数量 配置示例
  • 使用Python生成二维码的完整指南
  • 排序前言冒泡排序
  • 红队笔记Day3-->隧道上线不出网机器
  • C 练习实例70-求字符串长度
  • HarmonyOS—@State装饰器:组件内状态
  • Linux系统——防火墙拓展及重点理解
  • 阿里云短信验证码的两个坑
  • c入门第十五篇——学而时习之(阶段性总结)
  • 抽象的前端
  • UPC训练赛二十/20240217
  • 【51单片机】LCD1602(江科大)
  • conda与pip的常用命令
  • 你知道什么是物联网MQTT么?
  • P8 pair vector
  • 奇异值分解(SVD)的应用——图像压缩
  • RTDETR改进系列指南
  • 类和结构体的区别
  • 利用Excel模拟投币试验
  • WebService接口测试
  • 语音唤醒——
  • typeScript 类型推论
  • JavaScript 设计模式之代理模式
  • JavaScript 对象判断
  • Android下SF合成流程重学习之onMessageInvalidate
  • 基于SpringBoot+WebSocket+Spring Task的前后端分离外卖项目-订单管理(十七)
  • 【Java多线程进阶】JUC常见类以及CAS机制
  • Python算法100例-1.7 最佳存款方案