如何在NodeJS中实现授权
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
介绍:
身份验证和授权是Web应用程序安全中的两个基本概念。在构建Web应用程序时,确保只有授权用户才能访问网站的特定部分对于安全性至关重要。而身份验证和授权正是在此发挥作用。
在本文中,我们将讨论身份验证和授权,以及如何在我们的Nodejs应用程序中实现它们。
那么,事不宜迟,让我们开始吧!
理解授权
什么是授权?
授权是指授予用户执行特定工作/操作的权限的过程。它决定了已认证用户在应用程序中可以执行哪些操作。身份验证之后,授权确保用户仅执行其被允许的操作,并遵守特定的规则和权限。
一些常见的身份验证方式包括:
-
基于角色的访问控制(RBAC)
-
基于属性的访问控制(ABAC)
-
基于策略的访问控制(PBAC)
授权机制是如何运作的?
授权流程如下:
-
已认证用户向服务器发出请求。
-
服务器验证用户身份并获取其分配的角色和权限。
-
服务器会评估用户是否拥有执行所请求操作的权限。
-
如果用户已获得授权,服务器将允许用户执行所请求的操作。
-
否则,它将拒绝访问并返回相应的响应。
什么是基于角色的访问控制(RBAC)?
基于角色的访问控制是一种访问控制方法,它根据用户在应用程序中被分配的角色来授予用户权限。简单来说,它控制用户在应用程序中可以执行的操作。
RBAC(基于角色的访问控制)并非直接为单个用户分配权限,而是将用户分组为不同的角色,然后再为这些角色分配权限。这样一来,访问控制的管理就更加便捷,因为我们只需更新角色的权限,而无需逐个用户进行更新。
基于角色的访问控制(RBAC)的关键组成部分包括:
-
角色:定义应用程序中的一系列职责、任务或功能
-
权限:表示用户可以执行的具体操作。
-
角色分配:用户被分配到一个或多个角色,每个角色都与一组权限相关联。
-
访问控制策略:规定哪些角色可以访问特定资源以及他们可以执行哪些操作。
在NodeJS中实现授权
到目前为止,我们已经了解了身份验证和授权的概念。接下来,我们将探讨如何在我们的NodeJS应用程序中实现它们。
在本节中,我们将构建一个简单的NodeJs应用程序,并集成身份验证和授权功能。
基本项目设置和身份验证
要设置一个基本的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);
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" });
}
});
在登录过程中,就像验证用户名和密码一样,我们也会验证用户的角色。
// 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" });
}
});
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;
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}`);
});
5. 测试端点:
在注册流程中,我们将创建一个具有管理员角色的新用户。
为此,我们将向目标服务器发送一个 POST 请求,http://localhost:3000/auth/signup请求体如下:
{
"username": "Arindam Majumder",
"password": "071204",
"role": "admin"
}
新用户已注册。我们更新后的注册报价功能正常。
同样地,在登录路由中,我们将获取新用户的令牌。
为此,我们将向目标服务器发送一个http://localhost:3000/auth/login带有类似请求体的 GET 请求:
{
"username": "Arindam Majumder",
"password": "071204",
"role": "admin"
}
我们会得到一个类似这样的令牌:
现在,我们将测试我们的管理路由。为此,我们将发送一个 GET 请求,请求http://localhost:3000/admin体如下:
{
"username": "Arindam Majumder",
"password": "071204",
"role": "admin"
}
这次我们还需要添加一个授权标头,并在其中添加令牌以验证用户身份。
Authorization = USERS_JWT_TOKEN
我们将收到以下回复:
这意味着我们的端点运行正常。
至此,我们已成功在 Node.js 应用程序中实现了授权功能。
结论
总的来说,身份验证和授权在现代 Web 应用程序中非常重要。
本文介绍了身份验证和授权的基础知识,以及如何将它们集成到 NodeJs 应用程序中。
希望这篇文章对您有所帮助。欢迎在评论区分享您的反馈意见。
付费合作请联系:arindammajumder2020@gmail.com
请在Twitter、LinkedIn、Youtube和GitHub上关注我。
祝您编程愉快!
文章来源:https://dev.to/arindam_1729/how-to-implement-authorization-in-nodejs-31hk
