Egg.js中间件进行登录鉴权的核心思路

本文涉及的产品
性能测试 PTS,5000VUM额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: Egg.js中间件进行登录鉴权的核心思路

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

无论是在实际项目中还是在面试中,只要涉及到项目的问题,注册登录如何验证的问题,总是面试官的宠儿,这一次让我们来系统性的梳理如何完成一次登录的验证。(注意:项目实现的基础是以Egg.js作为后台实现的)

第一步:配置中间件

  1. 在middleware下创建adminAuth.js文件
  • 中间件中需要配置csrf全局变量,让表单post的数据能够正常的到达控制器login.js
  • 通过url模块拿到用户不带请求参数的请求路径
  • 首先判断session中userinfo是否存在,并且username是否存在,两个条件都满足的时候,才允许继续执行,只要有一个不满足则判断路径是否是涉及到登录的路径,如果是则允许继续进行,这样是为了防止死锁现象的发生,如果不是涉及到登录的路径,则跳转到登录页面,让用户登录。
const url = require("url");
module.exports = (options) => {
  return async function adminAuth(ctx,next) {
    console.log("中间件");
    console.log(ctx.request.url);
    // 配置全局变量
    ctx.state.csrf = ctx.csrf;
    const pathname = url.parse(ctx.request.url).pathname;
    if (ctx.session.userinfo && ctx.session.userinfo.username) {
      await next();
    } else {
      // 没有权限则跳转到登录
      if (pathname === "/admin/login" || pathname === "/admin/doLogin" || pathname === "/admin/login/captcha") {
        await next();        
      } else {
        ctx.redirect("/admin/login");
      }
    }
    // await next();
  }
}
复制代码
  1. 在config.default.js中注册中间件
  • 设置中间件只拦截路径包含/admin。
config.middleware = ["adminAuth"];
  config.adminAuth = {
    match: '/admin'
  }
复制代码

第二步:使用Sequelize操作数据库

数据库结构

  • 数据表结构

image.png

  • 安装sequelize插件
npm install --save egg-sequelize mysql2
复制代码
  • 在plugin.js中引入插件
module.exports = {
  // had enabled by egg
  static: {
    enable: true
  },
  ejs: {
    enable: true,
    package: 'egg-view-ejs'
  },
  sequelize: {
    enable: true,
    package: 'egg-sequelize',
  }
}
复制代码
  • 在config.default.js中配置数据库的基本信息
config.sequelize = {
    dialect: 'mysql',
    host: 'localhost',
    port: 3306,
    username: "root",
    password: "123456",
    database: 'eggshop',
  };
复制代码
  • 在app下新建model文件夹并在这个文件夹下建立admin.js
'use strict';
module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;
  const Admin = app.model.define('admin', {
    id: {type: INTEGER,primaryKey: true,autoIncrement: true},
    username: STRING(255),
    password: STRING(32),
    mobile: STRING(32),
    email: STRING(255),
    status: INTEGER(1),
    roleId: INTEGER(11),
    addTime: INTEGER(11),
    isSuper: INTEGER(1),
    lastLogin: INTEGER(11),
  },{
    timestamps: false,
    tableName: 'admin'     
  });
  return Admin;
};
复制代码

第三步:处理登录信息

将用户的密码进行md5加密

  1. 安装md5模块
npm install md5
复制代码
  1. 在服务中封装md5
const md5 = require('md5');
class ToolsService extends Service {
  md5(msg) {
    return md5(msg);
  }
}
复制代码

在控制器中处理核心登录逻辑

  1. 获取用户输入的用户名、密码、验证码。
  2. 首先判断用户输入的验证码和session中存在的验证码是否一致,如果不一致则跳转到登录页面,一致则进行第三步。
  3. 通过sequelize框架去数据库中查询该用户名和密码是否存在,如果存在则跳转到管理模块,如果不存在则跳转到登录登录模块。

注意:服务器存储验证码的时候是用户获取验证码的时候,也就是说用户获取验证码的时候同时将这个验证码存储在了服务器端。

相关文章
|
1月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第36天】在探索Node.js的奥秘之旅中,中间件的概念如同魔法一般,它让复杂的请求处理变得优雅而高效。本文将带你领略这一机制的魅力,从概念到实践,一步步揭示如何利用中间件简化和增强你的应用。
|
1月前
|
前端开发 JavaScript 安全
HTML+CSS+JS密码灯登录表单
通过结合使用HTML、CSS和JavaScript,我们创建了一个带有密码强度指示器的登录表单。这不仅提高了用户体验,还帮助用户创建更安全的密码。希望本文的详细介绍和代码示例能帮助您在实际项目中实现类似功能,提升网站的安全性和用户友好性。
46 3
|
1月前
|
消息中间件 JavaScript 中间件
深入浅出Node.js中间件机制
【10月更文挑战第24天】在Node.js的世界里,中间件如同厨房中的调料,为后端服务增添风味。本文将带你走进Node.js的中间件机制,从基础概念到实际应用,一探究竟。通过生动的比喻和直观的代码示例,我们将一起解锁中间件的奥秘,让你轻松成为后端料理高手。
35 1
|
25天前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
2月前
|
JSON JavaScript 中间件
深入浅出Node.js中间件机制
本文将带你探索Node.js中一个核心概念——中间件机制。我们将通过浅显的语言和生动的比喻,揭示中间件如何作为请求和响应之间的“交通枢纽”,在应用程序中起到至关重要的作用。从基础原理到实际应用,你将了解到中间件不仅简化了代码结构,还提高了开发效率,是Node.js开发不可或缺的一部分。
54 1
|
2月前
|
JavaScript
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(二)
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
48 0
|
2月前
|
存储 JSON JavaScript
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
108 0
|
4月前
|
资源调度 JavaScript API
nest.js + sms 实现短信验证码登录
本文介绍了在Nest.js框架中集成短信验证码登录的实现方案,详细阐述了使用阿里云短信服务的配置流程、资质申请、短信模板设置,并提供了API调用示例和工程代码的运行步骤。
nest.js + sms 实现短信验证码登录
|
2月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第4天】在探索Node.js的海洋中,中间件机制犹如一座灯塔,为开发者指引方向。本文将带你一探究竟,从浅入深地理解这一核心概念。我们将通过生动的比喻和实际代码示例,揭示中间件如何在请求和响应之间搭建桥梁,实现功能的扩展与定制。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
56 0
|
3月前
|
JavaScript 前端开发 中间件
深入浅出Node.js中间件模式
【9月更文挑战第13天】本文将带你领略Node.js中间件模式的魅力,从概念到实战,一步步揭示如何利用这一强大工具简化和增强你的Web应用。我们将通过实际代码示例,展示中间件如何在不修改原有代码的情况下,为请求处理流程添加功能层。无论你是前端还是后端开发者,这篇文章都将为你打开一扇通往更高效、更可维护代码的大门。