发布于 2026-01-05 0 阅读
0

How to Implement Authorization in NodeJS DEV's Worldwide Show and Tell Challenge Presented by Mux: Pitch Your Projects!

如何在NodeJS中实现授权

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

介绍:

身份验证和授权是Web应用程序安全中的两个基本概念。在构建Web应用程序时,确保只有授权用户才能访问网站的特定部分对于安全性至关重要。而身份验证和授权正是在此发挥作用。

在本文中,我们将讨论身份验证和授权,以及如何在我们的Nodejs应用程序中实现它们。

那么,事不宜迟,让我们开始吧!

理解授权

电脑屏幕特写,显示HTML代码以及一条错误信息,内容为:

什么是授权?

授权是指授予用户执行特定工作/操作的权限的过程。它决定了已认证用户在应用程序中可以执行哪些操作。身份验证之后,授权确保用户仅执行其被允许的操作,并遵守特定的规则和权限。

一些常见的身份验证方式包括:

  • 基于角色的访问控制(RBAC)

  • 基于属性的访问控制(ABAC)

  • 基于策略的访问控制(PBAC)

授权机制是如何运作的?

授权流程如下:

  • 已认证用户向服务器发出请求。

  • 服务器验证用户身份并获取其分配的角色和权限。

  • 服务器会评估用户是否拥有执行所请求操作的权限。

  • 如果用户已获得授权,服务器将允许用户执行所请求的操作。

  • 否则,它将拒绝访问并返回相应的响应。

什么是基于角色的访问控制(RBAC)?

此图展示了基于角色的访问控制 (RBAC)。客户端向管理节点管理器发送包含用户凭据的管理服务请求。管理节点管理器定义权限级别的角色,并与服务 1、服务 2 和服务 3 交互以执行身份验证,确保客户端拥有访问权限。然后,客户端接收并处理响应。

基于角色的访问控制是一种访问控制方法,它根据用户在应用程序中被分配的角色来授予用户权限。简单来说,它控制用户在应用程序中可以执行的操作。

RBAC(基于角色的访问控制)并非直接为单个用户分配权限,而是将用户分组为不同的角色,然后再为这些角色分配权限。这样一来,访问控制的管理就更加便捷,因为我们只需更新角色的权限,而无需逐个用户进行更新。

基于角色的访问控制(RBAC)的关键组成部分包括:

  • 角色:定义应用程序中的一系列职责、任务或功能

  • 权限:表示用户可以执行的具体操作。

  • 角色分配:用户被分配到一个或多个角色,每个角色都与一组权限相关联。

  • 访问控制策略:规定哪些角色可以访问特定资源以及他们可以执行哪些操作。

在NodeJS中实现授权

到目前为止,我们已经了解了身份验证和授权的概念。接下来,我们将探讨如何在我们的NodeJS应用程序中实现它们。

在本节中,我们将构建一个简单的NodeJs应用程序,并集成身份验证和授权功能。

基本项目设置和身份验证

要设置一个基本的Node.js项目并添加JWT身份验证,您可以查看以下文章,其中我详细解释了每个步骤:

设置基本的 Node.js 项目并添加 JWT 身份验证

实施授权

在本节中,我们将在Nodejs应用程序中实现授权功能。

1. 更新用户架构:

我们将更新用户架构,并添加一个“角色”字段,用于定义用户的角色/权限范围。我们将在后续章节中使用这些角色进行授权。

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
  role:{
    type: String,
    required: true,
    default: "user",
  }
});

module.exports = mongoose.model("User", userSchema);
Enter fullscreen mode Exit fullscreen mode

2. 更新认证路由:

接下来,我们将更新 ` /signupand`/login路由。我们将从注册路由的请求体中获取新添加的角色。

// updated sign up
router.post("/signup", async (req, res) => {
  try {
    const { username, password, role } = req.body;
    const user = new User({ username, password,role });
    await user.save();
    res.status(201).json({ message: "New user registered successfully" });
  } catch (error) {
    res.status(500).json({ message: "Internal server error" });
  }
});
Enter fullscreen mode Exit fullscreen mode

在登录过程中,就像验证用户名和密码一样,我们也会验证用户的角色。

// Updated Login route
router.post("/login", async (req, res) => {
  const { username, password, role } = req.body;
  try {
    const user = await User.findOne({ username });

    if (!user) {
      return res.status(401).json({ message: "Invalid username or password" });
    }
    if (user.password !== password) {
      return res.status(401).json({ message: 'Invalid username or password' });
    }
    if (user.role !== role) {
      return res.status(401).json({ message: 'Invalid role' });
    }
    // Generate JWT token
    const token = jwt.sign(
      { id: user._id, username: user.username, role: user.role},
      process.env.JWT_SECRET
    );
    res.json({ token });
  } catch (error) {
    res.status(500).json({ message: "Internal server error" });
  }
});
Enter fullscreen mode Exit fullscreen mode

3. 创建管理员验证中间件:

现在,我们将创建一个中间件来验证用户是否为管理员。

function verifyAdmin(req, res, next) {

    if (req.user.role !== "admin") {
      return res.status(401).json({ message: "Access denied. You need an Admin role to get access." });
    }
    next();
  }

module.exports = verifyAdmin;
Enter fullscreen mode Exit fullscreen mode

4. 创建管理员路由:

之后,我们将在主路由中创建一个管理员路由index.js,以验证用户是否具有管理员权限。

// index.js
const adminMiddleware = require("./middleware/admin");

app.get("/admin", userMiddleware, adminMiddleware, (req, res) => {
  const { username } = req.user;
  res.send(`This is an Admin Route. Welcome ${username}`);
});
Enter fullscreen mode Exit fullscreen mode

5. 测试端点:

在注册流程中,我们将创建一个具有管理员角色的新用户。

为此,我们将向目标服务器发送一个 POST 请求,http://localhost:3000/auth/signup请求体如下:

{
    "username": "Arindam Majumder",
    "password": "071204",
    "role": "admin"
}
Enter fullscreen mode Exit fullscreen mode

Postman界面截图,显示了一个POST请求

新用户已注册。我们更新后的注册报价功能正常。

同样地,在登录路由中,我们将获取新用户的令牌。

为此,我们将向目标服务器发送一个http://localhost:3000/auth/login带有类似请求体的 GET 请求:

{
    "username": "Arindam Majumder",
    "password": "071204",
    "role": "admin"
}
Enter fullscreen mode Exit fullscreen mode

我们会得到一个类似这样的令牌:

Postman界面截图,显示了一个POST请求

现在,我们将测试我们的管理路由。为此,我们将发送一个 GET 请求,请求http://localhost:3000/admin体如下:

{
    "username": "Arindam Majumder",
    "password": "071204",
    "role": "admin"
}
Enter fullscreen mode Exit fullscreen mode

这次我们还需要添加一个授权标头,并在其中添加令牌以验证用户身份。

Authorization = USERS_JWT_TOKEN
Enter fullscreen mode Exit fullscreen mode

我们将收到以下回复:

Postman 界面截图,显示了一个 GET 请求

这意味着我们的端点运行正常。

至此,我们已成功在 Node.js 应用程序中实现了授权功能。

结论

总的来说,身份验证和授权在现代 Web 应用程序中非常重要。

本文介绍了身份验证和授权的基础知识,以及如何将它们集成到 NodeJs 应用程序中。

希望这篇文章对您有所帮助。欢迎在评论区分享您的反馈意见。

付费合作请联系:arindammajumder2020@gmail.com

请在TwitterLinkedInYoutubeGitHub上关注我

祝您编程愉快!

谢谢 :)

文章来源:https://dev.to/arindam_1729/how-to-implement-authorization-in-nodejs-31hk