MERN 堆栈中基于角色的身份验证:完整指南
身份验证是 Web 应用程序的一个重要方面,确保只有授权用户才能访问某些资源。基于角色的身份验证 (RBAC) 更进一步,根据用户的角色为用户分配不同的权限。
在这篇文章中,我们将介绍:
✅ 什么是基于角色的身份验证?
✅ 为什么使用基于角色的身份验证?
✅ 如何在 MERN Stack 应用程序中实施 RBAC
什么是基于角色的身份验证?
基于角色的访问控制 (RBAC) 是一种安全方法,其中为用户分配角色,每个角色都有特定的权限。
例如,在电子商务应用程序中:
管理员可以添加、编辑或删除产品。
卖家可以管理自己的产品。
顾客只能查看和购买产品。
这确保用户只能执行与其角色相关的操作。
为什么使用基于角色的身份验证?
✔ 增强的安全性 – 防止未经授权的访问敏感操作。
✔ 可扩展性 – 随着系统的增长轻松添加新角色和权限。
✔ 更好的用户管理 – 无需修改代码即可分配权限。
如何在 MERN Stack 应用程序中实现 RBAC?
1️⃣ 设置用户模型 (MongoDB Mongoose)
在你的 models/user.model.js 中:
javascript
复制代码
const mongoose = require("mongoose");
const UserSchema = new mongoose.Schema({
用户名:{ 类型:字符串,必需:true,唯一:true },
电子邮件:{ 类型:字符串,必需:true,唯一:true },
密码:{ 类型:字符串,必需:true },
角色:{
类型:字符串,
枚举:[“管理员”,“卖家”,“客户”],
默认值:“客户”
}
});
module.exports = mongoose.model("User", UserSchema);
?在这里,每个用户都有一个角色字段,它决定了他们的权限。
2️⃣ 生成用于身份验证的 JWT 令牌
在你的controllers/auth.controller.js中:
javascript
复制代码
const jwt = require("jsonwebtoken");
const User = require("../models/user.model");
const login = async (req, res) =>; {
const { 电子邮件, 密码 } = req.body;
const user = wait User.findOne({ email });
if (!user || user.password !== 密码) {
return res.status(401).json({ message: "无效凭证" });
}
const token = jwt.sign({ userId: user._id, role: user.role }, "SECRET_KEY", { expiresIn: "1h" });
res.json({ token, role: user.role });
};
module.exports = { 登录 };
?此函数生成包含用户角色的 JWT 令牌。
3️⃣ 创建中间件来限制访问
在 middlewares/auth.middleware.js 中:
javascript
复制代码
const jwt = require("jsonwebtoken");
constauthenticate = (req, res, next) =>; {
const token = req.header("授权")?.split(" ")[1];
if (!token) return res.status(403).json({ message: "访问被拒绝" });
尝试{
const 解码 = jwt.verify(token, "SECRET_KEY");
req.user = 已解码;
下一个();
} 捕获(错误){
res.status(401).json({ message: "无效令牌" });
}
};
const 授权 = (角色) => {
返回(请求,res,下一个)=> {
if (!roles.includes(req.user.role)) {
return res.status(403).json({ message: "Forbidden" });
}
下一个();
};
};
module.exports = { 验证、授权 };
?验证 – 确保只有登录的用户才能访问路由。
?授权 – 根据角色限制访问。
4️⃣ 根据用户角色保护路由
在routes/admin.routes.js中:
javascript
复制代码
const express = require("express");
const { 验证、授权 } = require("../middlewares/auth.middleware");
const router = express.Router();
router.get("/admin-dashboard", 验证, 授权(["admin"]), (req, res) => {
res.json({ message: "欢迎来到管理仪表板" });
});
module.exports = 路由器;
?只有具有 admin 角色的用户才能访问 /admin-dashboard。
5️⃣ 在 React 中实现基于角色的 UI
在 App.js(前端)中:
javascript
复制代码
import { useState, useEffect } from "react";
从“axios”导入 axios;
const App = () =>; {
const [role, setRole] = useState(null);
useEffect(() => {
const token = localStorage.getItem("token");
如果(令牌){
const 解码 = JSON.parse(atob(token.split(".")[1]));
setRole(decoded.role);
}
}, []);
返回(
欢迎使用 MERN 基于角色的身份验证
{角色 === "admin" && 管理仪表板}
{角色===“卖家”&&卖家仪表板}
{角色===“客户”&&客户仪表板}
);
};
导出默认应用程序;
? UI 根据用户的角色显示不同的仪表板。
结论
基于角色的身份验证是现代 Web 应用程序中必不可少的安全措施。通过在 MERN Stack 中实现 RBAC,您可以有效地控制用户权限。
?后续步骤:
?添加管理员角色管理面板。
?对密码实施数据库加密。
?使用刷新令牌以获得更好的安全性。
想了解更多吗?在评论中留下你的问题! ?
以上是MERN 堆栈中基于角色的身份验证:完整指南的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...
