身份验证是 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);
}
}, []);
返回(
导出默认应用程序;
? UI 根据用户的角色显示不同的仪表板。
结论
基于角色的身份验证是现代 Web 应用程序中必不可少的安全措施。通过在 MERN Stack 中实现 RBAC,您可以有效地控制用户权限。
?后续步骤:
?添加管理员角色管理面板。
?对密码实施数据库加密。
?使用刷新令牌以获得更好的安全性。
想了解更多吗?在评论中留下你的问题! ?
以上是MERN 堆栈中基于角色的身份验证:完整指南的详细内容。更多信息请关注PHP中文网其他相关文章!