Node.js + Express + Passport 实现用户权限认证的方法

在 Web 应用中,用户权限认证是一项非常重要的功能,它可以保护用户的隐私和数据安全。Node.js 是一个非常流行的服务器端 JavaScript 运行环境,而 Express 是一个基于 Node.js 的 Web 应用框架,它提供了方便快捷的路由、中间件等功能。Passport 是一个 Node.js 的用户认证中间件,它可以帮助我们实现用户登录、注册、退出等功能。本文将介绍如何使用 Node.js + Express + Passport 实现用户权限认证的方法,并提供示例代码,帮助读者快速学习和理解。

1. 安装和配置

在开始之前,我们需要安装 Node.js 和 Express,并创建一个新的项目。可以使用以下命令:

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

接下来,我们需要安装 Passport 和相关的认证策略。可以使用以下命令:

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

Passport 支持多种认证策略,包括本地认证、OAuth 认证、JWT 认证等。在本文中,我们将使用本地认证和 JWT 认证实现用户权限认证。

2. 实现本地认证

本地认证是一种基于用户名和密码的认证方式。在 Express 中,可以使用 passport-local 策略实现本地认证。首先,我们需要在 app.js 中配置 Passport:

-- ------

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

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

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

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

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

其中,passport.initialize() 和 passport.session() 是必须的中间件,用于初始化 Passport 和启用会话支持。passport.use() 用于注册一个认证策略,这里我们使用了 passport-local 策略,并实现了认证逻辑。passport.serializeUser() 和 passport.deserializeUser() 分别用于将用户对象序列化和反序列化,以便在会话中存储和检索用户信息。

接下来,我们需要在路由中使用 Passport 进行本地认证:

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

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

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

这里我们定义了一个 POST 请求的路由,用于处理用户登录。passport.authenticate() 是 Passport 提供的认证中间件,它接收一个认证策略的名称,这里是 local,表示本地认证。如果认证成功,将会执行后面的回调函数,否则将会重定向到登录页面。最后,我们使用 res.redirect() 将用户重定向到主页。

3. 实现 JWT 认证

JWT 认证是一种基于 JSON Web Token 的认证方式。在 Express 中,可以使用 passport-jwt 策略实现 JWT 认证。首先,我们需要在 app.js 中配置 Passport:

-- ------

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

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

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

其中,passport-jwt 提供了 ExtractJwt 来从请求头中提取 JWT,以及 JwtStrategy 来实现 JWT 认证逻辑。opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken() 表示从请求头的 Authorization 字段中提取 JWT。opts.secretOrKey = 'secret' 表示 JWT 的签名密钥。

接下来,我们需要在路由中使用 Passport 进行 JWT 认证:

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

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

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

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

这里我们定义了一个 POST 请求的路由,用于处理用户登录。在登录成功后,我们使用 jwt.sign() 生成 JWT,并将其返回给客户端。在 GET 请求的路由中,我们使用 passport.authenticate() 进行 JWT 认证,如果认证成功,将会执行后面的回调函数,否则将会返回 401 错误。在回调函数中,我们可以通过 req.user 获取当前用户的信息。

4. 实现用户权限控制

用户权限控制是一项非常重要的功能,它可以限制不同用户对不同资源的访问权限。在 Express 中,可以使用中间件来实现用户权限控制。首先,我们需要定义一个中间件,用于检查用户的权限:

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

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

这里我们定义了一个 checkPermission 中间件,它接收一个权限参数,并返回一个中间件函数。在中间件函数中,我们首先检查当前用户是否存在,以及用户是否具有指定的权限,如果是,则调用 next() 继续执行下一个中间件或路由,否则返回 403 错误。

接下来,我们可以在路由中使用 checkPermission 中间件来实现用户权限控制:

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

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

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

这里我们定义了一个 GET 请求的路由,用于访问管理员页面。在中间件链中,我们首先使用 passport.authenticate() 进行 JWT 认证,然后使用 checkPermission('admin') 中间件进行权限控制,只有具有 admin 权限的用户才能访问该页面。

5. 总结

本文介绍了如何使用 Node.js + Express + Passport 实现用户权限认证的方法,并提供了详细的示例代码。通过本文的学习,读者可以了解到 Passport 的基本使用方法,以及如何实现本地认证和 JWT 认证、用户权限控制等功能。同时,本文还提供了一些实用的中间件代码,帮助读者快速实现自己的 Web 应用。

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


猜你喜欢

  • Mongoose 如何使用 options 来配置 connection

    Mongoose 是一个 Node.js 的 MongoDB 驱动程序,它提供了一种简单的方式来管理 MongoDB 数据库的连接和操作。在 Mongoose 中,我们可以使用 options 来配置...

    1 年前
  • 聊聊 ES6 的 Default Function Parameters(默认函数参数)

    在 ES6 中,我们可以使用 Default Function Parameters 来为函数的参数设置默认值。这个特性可以让我们编写更加简洁、易读的代码,并且可以提高代码的可重用性和可维护性。

    1 年前
  • 分享 ES2020 的新特性:Promise.allSettled() 方法的使用

    在 ES2020 中,Promise.allSettled() 方法是一个非常实用的新特性,它可以让我们更方便地处理 Promise 数组的并发请求,同时避免了 Promise.all() 方法在遇到...

    1 年前
  • 单页应用数据管理之 Redux 的 Thunk 中间件

    在前端开发中,数据管理是一个非常重要的问题。特别是在单页应用中,数据管理更是需要有一个统一的方案来解决。Redux 是一个非常流行的数据管理框架,它提供了一种可预测的状态管理方案,使得我们可以更加方便...

    1 年前
  • JavaScript ES7-ES9 的新特性自觉整理指南

    JavaScript 是一门非常流行的编程语言,在前端开发中得到广泛应用。随着技术的不断发展,JavaScript 的语言规范也在不断更新,其中 ES7-ES9 的新特性为开发者们带来了更多的便利。

    1 年前
  • PWA 下网络请求出现 CORS 问题的解决方案

    什么是 CORS 问题? CORS(Cross-Origin Resource Sharing)跨域资源共享,是一种浏览器安全策略,用于限制跨域访问资源。在 PWA 应用中,我们经常会遇到跨域请求数据...

    1 年前
  • 如何使用 ES8/ES2017 的 Proxy 拦截器

    前言 ES8/ES2017 引入了 Proxy 拦截器,这是一个非常强大的特性,可以用于拦截对象的各种操作,比如获取属性、设置属性、函数调用等。在前端开发中,我们经常需要对对象进行一些特殊处理,比如数...

    1 年前
  • 如何使用 Custom Elements 实现演示文稿组件

    在前端开发中,演示文稿是一种非常常见的形式,它可以用于展示产品功能、演示项目进展等。而如果能够通过自定义组件的方式来实现演示文稿,就可以更加灵活地控制样式和交互效果。

    1 年前
  • 性能优化技巧:编写更快的 JS 代码

    JavaScript 是一种非常强大的编程语言,可以用于构建各种应用程序,从简单的网页到复杂的框架和库。然而,JavaScript 代码的性能问题可能会导致应用程序运行缓慢或产生其他问题。

    1 年前
  • Kubernetes 中使用 KEDA 实现自动伸缩

    Kubernetes 是一种可靠、可扩展的容器编排平台,可以帮助我们管理和部署容器化应用程序。但是,随着应用程序的规模不断增长,手动管理容器的数量和资源分配变得越来越困难。

    1 年前
  • 如何在 VS Code 中编写 LESS

    什么是 LESS LESS 是一种 CSS 预处理器,它可以让你使用类似编程语言的方式来编写 CSS。LESS 提供了许多有用的特性,例如变量、嵌套、混合等,可以帮助你更快捷、更高效地编写和维护 CS...

    1 年前
  • Jest 测试 React 组件时出现 “Cannot read property 'XXX' of undefined” 的错误

    在使用 Jest 进行 React 组件测试时,你可能会遇到 “Cannot read property 'XXX' of undefined” 的错误,这个错误通常是由于在测试过程中未能正确地设置组...

    1 年前
  • 构建障碍无阻的 Web 设计:方法和突破口

    随着互联网的不断发展和普及,Web 设计已经成为了一个不可或缺的领域。然而,对于很多前端开发者来说,构建一个无障碍的 Web 设计还是一个挑战。在这篇文章中,我们将探讨一些方法和突破口,帮助你构建一个...

    1 年前
  • Koa2 中使用 koa-router 进行路由管理详解

    在前端开发中,路由管理是非常重要的一部分。Koa2 是一个轻量级的 Node.js Web 框架,常常被用于后端开发。而 koa-router 则是 Koa2 中常用的路由管理工具。

    1 年前
  • RxJS 中的 operator 和 pipe 使用详解

    RxJS 是一个强大的 JavaScript 库,它提供了一种响应式编程的方式来处理异步数据流。RxJS 中有很多的 operator,它们可以用于处理数据流并且能够提高代码的可读性和可维护性。

    1 年前
  • SSE 实现的电子商务实时竞价功能

    在电子商务领域,实时竞价功能是非常重要的一项功能。它可以让买家和卖家在实时交互中达成最优价值的交易。而 SSE 技术则是实现实时竞价功能的一种有效方法。本文将介绍如何使用 SSE 技术实现电子商务实时...

    1 年前
  • Material Design 风格的 Snackbar

    Material Design 是 Google 推出的一种新的设计语言,旨在为用户提供更加一致、更加美观、更加直观的用户体验。Snackbar 是 Material Design 风格中的一种提示组...

    1 年前
  • 解决 TypeScript 编译错误 “未找到命名空间或类型别名” 的问题

    在使用 TypeScript 进行开发时,我们可能会遇到“未找到命名空间或类型别名”的编译错误。这种错误可能会让我们感到困惑,因为我们可能已经正确引入了相关的模块。

    1 年前
  • 如何实现 RESTful API 中的限流控制

    在实际项目中,我们经常需要对 RESTful API 进行限流控制,以保证服务的可靠性和稳定性。本文将介绍如何实现 RESTful API 中的限流控制,包括令牌桶算法和漏桶算法两种实现方式。

    1 年前
  • 如何使用 Promise.all() 处理多个 Promise 并发

    在前端开发中,我们经常会遇到需要处理多个异步操作的场景,比如同时请求多个接口数据。而 Promise.all() 方法就是用来处理这种情况的,它可以将多个 Promise 对象并发执行,等所有 Pro...

    1 年前

相关推荐

    暂无文章