使用 Mongoose 和 Express 的中间件进行认证和授权

随着 Web 应用程序的流行和复杂性的增加,认证和授权已经变得越来越重要。许多 Web 应用程序要求用户进行身份验证,以便他们可以访问应用程序的功能和资源。此外,某些用户可能具有对某些资源进行更改的权限,而其他用户则不具备这些权限。在这种情况下,授权非常有用,它可以确保只有具有适当权限的用户才能对资源进行更改。

本文将介绍如何使用 Mongoose 和 Express 的中间件进行认证和授权。我们将创建一个简单的 Web 应用程序,并使用 Passport 中间件进行身份验证,使用 JSON Web Token(JWT)进行授权。此外,我们还将使用 Mongoose 来管理用户和资源数据。

一、基本要求

  • Node.js
  • MongoDB
  • NPM

二、项目初始化

首先,我们需要创建一个新的 Node.js 项目。在命令行中输入以下内容:

- ----- -----
- -- -----
- --- ---- --

接下来,安装以下依赖项:

- --- ------- ------ ------- -------- -------------- ------------ --------
  • express:Web 应用程序框架
  • passport:身份验证和登录管理器
  • passport-local:Passport 的 LocalStrategy
  • jsonwebtoken:JSON Web Tokens 的实现
  • mongoose:MongoDB 的对象数据建模库

三、创建 Mongoose 模型

我们需要使用 Mongoose 创建两个模型:

  • 用户模型(用于用户身份验证)
  • 资源模型(用于授权)

在 models 目录下创建 user.js 和 resource.js 文件。

1. user.js

----- -------- - --------------------
----- ------ - ------------------

----- ---------- - --- -----------------
  --------- - ----- ------- --------- ----- ------- ---- --
  --------- - ----- ------- --------- ---- -
---

---------------------- -------- ------ -
  ----- ---- - -----
  -- ------------------------------ -
    ------ -------
  -
  ------------------ ----- ----- -- -
    -- ----- -
      ------ ----------
    -
    -------------------------- ----- ----- ----- -- -
      -- ----- -
        ------ ----------
      -
      ------------- - -----
      -------
    ---
  ---
---

---------------------------------- - -------- ------------------- --------- -
  --------------------------------- -------------- ----- -------- -- -
    -- ----- -
      ------ --------------
    -
    -------------- ---------
  ---
--

-------------- - ---------------------- ------------

2. resource.js

----- -------- - --------------------

----- -------------- - --- -----------------
  ----- - ----- ------- --------- ---- --
  ------- - ----- ------------------------------- --------- ----- ---- ------ -
---

-------------- - -------------------------- ----------------

四、创建 Express 应用程序

在应用程序根目录下创建 app.js 文件,并添加以下代码:

----- ------- - -------------------
----- -------- - --------------------
----- -------- - --------------------
----- ------------- - -----------------------------------
----- ---------- - -----------------------
----- --- - ------------------------

----- ---- - -------------------------
----- -------- - -----------------------------

--------------------------------------------- - ---------------- ---- ---

----- --- - ----------

---------------------------

-------------------------------

---------------- ------------------------ --------- ----- -- -
  -------------- -------- -- ----- ----- -- -
    -- ----- -
      ------ ----------
    -
    -- ------- -
      ------ ---------- ------ - -------- ----- --- ------ ---
    -
    ------------------------------ ----- -------- -- -
      -- ----- -
        ------ ----------
      -
      -- --------- -
        ------ ---------- ------
      - ---- -
        ------ ---------- ------ - -------- ---------- --------- ---
      -
    ---
  ---
----

------------------ ----- ---- ----- -- -
  ------------------------------ ----- ----- ----- -- -
    -- ----- -
      ------ ----------
    -
    -- ------- -
      ------ ---------------------- -------- ------------ ---
    -
    --------------- - -------- ----- -- ----- -- -
      -- ----- -
        ------ ----------
      -
      ----- ----- - ---------- ------- -------- -- ----------
      ------ ---------- ----- ---
    ---
  ------- ---- ------
---

---------------------- ---------------------------- - -------- ----- --- ----- ---- -- -
  ----- -------- - --- ----------
    ----- --------------
    ------- ------------
  ---
  ------------------- -- -
    -- ----- -
      ------ ---------------------- -------- ----------- ---
    -
    ------ -------------------
  ---
---

--------------------- ---------------------------- - -------- ----- --- ----- ---- -- -
  --------------- ------- ------------ -- ----- ---------- -- -
    -- ----- -
      ------ ---------------------- -------- ----------- ---
    -
    ------ --------------------
  ---
---

---------------- -- -- -
  ---------------- --------- -- ---- -------
---

在应用程序中,我们使用了 Express 和 Passport 模块来处理认证和授权。我们定义了一个 /login 路由,该路由使用 LocalStrategy 从 MongoDB 数据库中验证用户提供的用户名和密码。成功认证登录之后,我们使用 JWT 返回一个签名的令牌。

我们还为 /resources 和 /resources/:id 定义了路由,这些路由需要一个有效的 JWT 才能访问。如果请求不包含有效的 JWT,则 Passport 会停止处理请求并返回一个 401 状态代码。

五、测试

在命令行中启动应用程序:

- ---- ------

要测试我们的应用程序,请使用任何 HTTP 客户端,例如 Postman 或 cURL。

首先,您需要创建新用户。在 Postman 中创建一个请求:

总结:本文介绍了如何使用 Mongoose 和 Express 的中间件进行简单的身份验证和授权。我们利用了 Passport 中间件来处理身份验证,并使用 JWT 来进行用户授权。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/646c5768968c7c53b0b55767


猜你喜欢

  • ES11 BigInt 新特性详解

    ECMAScript 新版本 ES11(即 ES2020)增加了一个重要的特性——BigInt,它可以处理超过 253-1 的整数,这个限制是 JavaScript 中 Number 类型的最大值。

    1 年前
  • Docker 中容器无法访问主机 MySQL 数据库的解决方法

    在使用 Docker 进行开发时,经常会遇到容器无法访问主机上的 MySQL 数据库的问题。这是因为 Docker 容器使用了不同的网络命名空间,并且默认情况下不会自动连接到主机的网络。

    1 年前
  • 如何正确使用 ES6 中的 Promise 解决回调地狱问题

    作者:AI写手 时间:2021年5月20日 在前端开发中,回调地狱问题一直是令人头疼的难题。回调地狱指的是在异步操作中,由于回调函数嵌套过多,代码变得难以阅读和维护,并且容易出现错误。

    1 年前
  • PM2 实现 Node.js 进程管理的几种方式

    作为一名前端开发人员,我们经常需要使用 Node.js 作为后端语言来进行开发。而在 Node.js 后端开发过程中,进程管理尤为重要,尤其是在处理高并发、负载高等情况下。

    1 年前
  • Mongoose 如何实现数据的自动填充和更新?

    在开发 Web 应用程序时,我们通常需要对数据进行自动填充和更新,以减少用户的输入和提高数据的准确性。在本文中,我们将介绍 Mongoose 如何实现数据的自动填充和更新,并提供一些示例代码帮助读者更...

    1 年前
  • RxJS 中的操作符 map

    RxJS 是一个负责异步编程的 JavaScript 库,通常用于 Angular 应用的开发。它提供了很多功能强大的操作符,以帮助开发人员更轻松的处理异步数据流。

    1 年前
  • Headless CMS 接入 WeChat MiniProgram

    Headless CMS(无头 CMS)是一种新兴的 CMS 设计模式,旨在将内容管理系统的内容和数据层与展示层分开。这种模式允许开发人员自由选择前端框架以及展示方式,同时也能够带来更好的开发和维护体...

    1 年前
  • Serverless 应用如何进行负载均衡

    随着云计算技术的不断发展,Serverless 应用逐渐成为了云计算领域的热门话题。Serverless 应用的出现为开发者提供了一种更加便捷、高效和成本更低的开发方式。

    1 年前
  • 如何在 ES9 中使用 Proxy 实现对象的拦截和监测

    在现代的 Web 应用开发中,JavaScript 已经成为最为流行的编程语言之一。而在 JavaScript 开发中,ES6 提供了许多非常实用的新特性,其中 Proxy 就是其中之一。

    1 年前
  • LESS 中如何垂直居中元素?

    在前端开发中,特别是在布局方面,实现元素垂直居中是一项非常常见的任务。虽然 CSS 提供了多种方式来实现,但我们还可以通过 LESS 的功能来更加简化和优化代码。 方法一:使用 Flexbox Fle...

    1 年前
  • 使用Web Components 实现响应式表格布局组件

    随着Web技术的不断发展,前端开发者们越来越注重对页面布局的响应式处理。而表格这个页面元素除了在数据展示方面得到了广泛的应用,也用于制作一些响应式布局。因此,本文将分享如何使用Web Componen...

    1 年前
  • Jest 测试框架:如何进行 React 和 Redux 的集成测试

    Jest 是一款由 Facebook 推出的 JavaScript 测试框架。它具有简单易用、运行速度快、支持快照测试等特点,成为了前端开发中不可或缺的一环。 在前端开发中,React 和 Redux...

    1 年前
  • Fastify 框架下的处理大型 SQL 查询的最佳实践

    随着互联网技术的迅猛发展,大型数据查询已成为了一个常见问题。为了优化 SQL 查询的性能,开发人员需要了解一些最佳实践。本篇文章将介绍在 Fastify 框架下处理大型 SQL 查询的最佳实践,并提供...

    1 年前
  • 使用 Socket.IO 实现实时用户行为跟踪的完整教程

    介绍 在 Web 开发中,跟踪用户行为并及时响应是一个很关键的问题。实时的用户行为跟踪可以让我们更好的理解用户的行为习惯,进而优化产品体验。而 Socket.IO 作为现在比较流行的一种实时通信方式,...

    1 年前
  • RESTful API 中如何解决数据缓存问题

    RESTful API 是一种基于 HTTP 协议的 Web API 设计标准,它将应用的功能抽象成一个 URI,通过 HTTP 方法来对资源进行操作,而这些操作可以被任何支持 HTTP 协议的客户端...

    1 年前
  • Cypress 测试遇到元素拖拽无法完成的问题如何解决

    前言 在前端开发中,我们经常会使用到自动化测试工具 Cypress,用于测试网站的各个功能是否正常,包括页面的交互、表单的提交等。其中,元素拖拽也是我们需要测试的一个功能。

    1 年前
  • Node.js 中的线程池和集群管理

    Node.js 是一种流行的、跑在服务器端上的 JavaScript 运行时环境,它使用事件驱动、非阻塞 I/O 模型,能够有效地处理高并发请求,因此广泛应用于 Web 应用程序的开发中。

    1 年前
  • Sequelize 中如何实现多集群方案

    在当今的云计算时代,多集群架构已经成为一个比较热门的话题。多集群可以带来更好的性能、可靠性、安全性等等优势,所以越来越多的公司和团队开始采用多集群方案。 在前后端分离的架构中,数据库是一个很重要的组成...

    1 年前
  • Webpack 如何处理 Less 文件?

    Less 是一种动态样式语言,它允许采用 CSS 预处理器的方式来编写 CSS。在前端开发中,Less 的应用越来越广泛,而 Webpack 则是目前主流的前端构建工具之一。

    1 年前
  • 解决 Express.js 中间件顺序错误导致的一些问题

    在 Express.js 中使用中间件是非常常见的操作,并且它可以帮助我们处理各种不同的请求和响应。但是,中间件的顺序却非常重要,错误的中间件顺序可能会导致一些问题和错误。

    1 年前

相关推荐

    暂无文章