详解nodejs中express搭建权限管理系统

下面我为您详细讲解“详解nodejs中express搭建权限管理系统”的完整攻略。

一、前置准备

在开始搭建权限管理系统之前,我们需要先进行一些前置准备工作:

  • 熟悉 Nodejs 和 Express 框架的基本语法和使用方法。
  • 安装 MongoDB 数据库和 Mongoose 数据库模块。
  • 了解 session 和 cookie 的基本概念。

二、安装依赖

接下来,我们需要安装一些依赖,这些依赖包括 express、body-parser、cookie-parser、express-session、mongoose、morgan、bcryptjs、cors、jsonwebtoken 等多个模块,具体安装命令如下:

npm install express body-parser cookie-parser express-session mongoose morgan bcryptjs cors jsonwebtoken --save

三、搭建项目框架

接下来,我们可以开始搭建项目框架了。具体步骤如下:

  1. 创建项目目录:
mkdir permission
  1. 进入项目目录后,初始化项目:
npm init -y
  1. 创建主文件 index.js:
touch index.js
  1. 打开 index.js 文件,引入必要的模块:
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const mongoose = require('mongoose');
const morgan = require('morgan');
const bcrypt = require('bcryptjs');
const cors = require('cors');
const jwt = require('jsonwebtoken');

四、搭建数据库模型

在搭建权限管理系统之前,我们需要定义好数据库中的数据模型。在此示例中,我们定义了两个模型,一个是用户模型,另一个是角色模型。具体代码如下:

//users模型
const userSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true, // 唯一性限制
    required: true // 必填项
  },
  password: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  role: { // 关联角色模型
    type: mongoose.Schema.Types.ObjectId,
    ref: 'roles'
  }
});

//角色模型
const roleSchema = new mongoose.Schema({
  name: {
    type: String,
    unique: true,
    required: true
  },
  permissions: { // 权限集合
    type: Array,
    default: []
  }
});

五、搭建路由

在完成数据模型的定义之后,我们需要搭建路由来响应客户端请求。在此示例中,我们定义了以下几个路由:

  1. 用户注册路由
app.post('/api/users/register', async (req, res) => {
  const { username, password, email } = req.body;
  const hashPassword = await bcrypt.hash(password, 10);
  const role = await Role.findOne({ name: 'user' }); // 默认注册为普通用户
  const user = new User({ username, password: hashPassword, email, role: role._id });
  await user.save();
  res.send('注册成功');
});
  1. 用户登录路由
app.post('/api/users/login', async (req, res) => {
  const { username, password } = req.body;
  const user = await User.findOne({ username });
  if (!user) {
    return res.status(400).send({ message: '用户名或密码错误' }); // 用户不存在
  }
  const isValid = await bcrypt.compare(password, user.password);
  if (!isValid) {
    return res.status(400).send({ message: '用户名或密码错误' }); // 密码错误
  }
  const token = jwt.sign({ userId: user._id }, 'secretkey'); // 生成 token
  res.cookie('token', token, { httpOnly: true }); // 设置 cookie
  res.send('登录成功');
});
  1. 获取用户信息路由
app.get('/api/users/info', async (req, res) => {
  const token = req.cookies.token;
  try {
    const decoded = jwt.verify(token, 'secretkey'); // 验证 token
    const user = await User.findOne({ _id: decoded.userId }).populate('role');
    if (!user) {
      return res.status(401).send({ message: '用户未登录' });
    }
    res.send(user);
  } catch {
    return res.status(401).send({ message: '用户未登录' });
  }
});
  1. 获取角色列表路由
app.get('/api/roles', async (req, res) => {
  const roles = await Role.find(); // 获取角色列表
  res.send(roles);
});

六、搭建中间件

在进行权限管理时,我们需要使用中间件来对客户端请求进行鉴权验证。在此示例中,我们定义了以下中间件:

  1. 鉴权中间件
const authMiddleware = async (req, res, next) => {
  const token = req.cookies.token;
  try {
    const decoded = jwt.verify(token, 'secretkey'); // 验证 token
    const user = await User.findOne({ _id: decoded.userId }).populate('role');
    if (!user) {
      return res.status(401).send({ message: '用户未登录' });
    }
    req.user = user;
    next();
  } catch {
    return res.status(401).send({ message: '用户未登录' });
  }
};
  1. 权限验证中间件
const permissionMiddleware = (permissions) => async (req, res, next) => {
  const user = req.user;
  const role = await Role.findOne({ _id: user.role });
  const hasPermission = permissions.every(p => role.permissions.indexOf(p) > -1); // 判断用户是否拥有对应权限
  if (!hasPermission) {
    return res.status(403).send({ message: '无操作权限' });
  }
  next();
};

七、实现权限管理

在完成路由和中间件的搭建之后,我们可以开始进行权限管理了。在此示例中,我们定义了以下两种权限请求:

  1. user:update 权限

示例代码如下:

// 当某个用户想要更新自己的资料时,需要拥有 user:update 权限
app.put('/api/users', authMiddleware, permissionMiddleware(['user:update']), async (req, res) => {
  const { username, email } = req.body;
  const user = req.user;
  user.username = username;
  user.email = email;
  await user.save();
  res.send('更新成功');
});
  1. role:create 权限

示例代码如下:

// 当管理员需要创建新角色时,需要拥有 role:create 权限
app.post('/api/roles', authMiddleware, permissionMiddleware(['role:create']), async (req, res) => {
  const roleName = req.body.name;
  const role = new Role({ name: roleName });
  await role.save();
  res.send('创建成功');
});

至此,我们的权限管理系统已经搭建完毕。

八、示例说明

以下是两条示例说明:

  1. 用户注册

客户端请求:

fetch('/api/users/register', {
  method: 'post',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ username: 'lucy', password: '123456', email: 'lucy@gmail.com' })
}).then(res => {
  console.log(res.text());
});

服务端响应:

注册成功
  1. 获取角色列表

客户端请求:

fetch('/api/roles').then(res => {
  res.json().then(roles => {
    console.log(roles);
  });
});

服务端响应:

[
  { "_id": "6132fc256e86112f6ff9d2cc", "name": "user", "permissions": [] },
  { "_id": "6132fc356e86112f6ff9d2cd", "name": "admin", "permissions": ["user:update", "role:create"] }
]

以上就是详解 nodejs 中 express 搭建权限管理系统的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解nodejs中express搭建权限管理系统 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • java 百度手写文字识别接口配置代码

    当我们需要在Java项目中使用百度手写文字识别接口进行文字识别时,需要进行如下步骤: 1. 百度账号注册与认证 在使用百度手写文字识别API之前,我们需要拥有百度账号并通过实名认证获取相应的API Key和Secret Key。具体步骤可以参照百度API开发者中心的相关文章进行操作。 2. 引入Java SDK 百度AI开放平台提供了Java SDK,我们可…

    人工智能概论 2023年5月25日
    00
  • 微信小程序使用百度AI识别接口的通用封装Promise详解

    微信小程序使用百度AI识别接口的通用封装Promise详解 1. 简介 本教程是针对微信小程序开发者,讲解如何使用百度AI识别接口,并提供了通用封装Promise,方便使用。 2. 百度AI识别接口介绍 2.1 接口列表 以下是百度AI提供的识别接口: 通用文字识别 通用文字识别(高精度版) 身份证识别 银行卡识别 驾驶证识别 行驶证识别 车牌识别 人脸检测…

    人工智能概论 2023年5月25日
    00
  • 在django-xadmin中APScheduler的启动初始化实例

    在Django-xadmin中使用APScheduler可以很方便地实现后台任务,如定时任务、计划任务等。本篇攻略将详细讲解在django-xadmin中APScheduler的启动初始化实例的过程。 安装APScheduler 在使用APScheduler之前,需要先安装它。可以通过pip命令来进行安装: pip install apscheduler 配…

    人工智能概览 2023年5月25日
    00
  • Java OpenCV学习之Mat的基本操作详解

    Java OpenCV学习之Mat的基本操作详解 1.概述 OpenCV是一个广泛应用于计算机视觉领域的开源库。从其名称可以看出,它最初是为C ++编写的,但随着时间的推移,也有了Java等其他语言版本。这篇文章是关于OpenCV的Java版本的Mat类的基本操作和用法优化的攻略。 2.Mat的基本操作 Mat是OpenCV中最常用的类,是处理图像和矩阵的数…

    人工智能概论 2023年5月24日
    00
  • Python pytesseract验证码识别库用法解析

    Python pytesseract验证码识别库用法解析 验证码识别是一个比较常见的需求,在Python中可以使用pytesseract库来进行验证码识别。本文详细讲解了pytesseract库的使用方法。 安装pytesseract库 在进行验证码识别前,需要先安装pytesseract库。在Python中,可以使用pip命令进行安装。在命令行中输入以下命…

    人工智能概论 2023年5月25日
    00
  • Django+Vue.js搭建前后端分离项目的示例

    下面将详细讲解“Django+Vue.js搭建前后端分离项目的示例”的完整攻略。 什么是Django? Django是一个高级的Python Web框架,它的主要目标是让Web应用的开发更加容易和快速。Django是一个MTV(即Model-Template-View)的设计模式,模型层(Model)是定义数据结构和数据库的一部分,视图层(View)是处理数…

    人工智能概览 2023年5月25日
    00
  • 云原生Docker部署Django和mysql项目全过程

    请注意,本回答涉及到很多技术和概念,可能需要您有一定的相关经验和知识储备。下面是云原生Docker部署Django和mysql项目全过程的完整攻略。 1. 前置条件 在进行云原生Docker部署Django和mysql项目的过程中需要准备以下环境: Docker及Docker Compose: 用于构建和管理容器化应用程序和服务 Django: Python…

    人工智能概览 2023年5月25日
    00
  • Serverless 架构如何演进详细介绍

    Serverless 架构是一种基于事件驱动的计算模型,它使开发人员可以编写和部署函数,而不必担心底层的基础设施和服务器管理。相比传统的基础设施,Serverless 更具有弹性和可扩展性。本文将介绍 Serverless 架构的演进历程,以及相关技术和工具的变化。 Serverless 的演进历程 第一阶段:无服务器计算 最初,Serverless 只是一…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部