首页 > web前端 > js教程 > MERN 堆栈中基于角色的身份验证:完整指南

MERN 堆栈中基于角色的身份验证:完整指南

Susan Sarandon
发布: 2025-01-10 22:39:42
原创
330 人浏览过

Role-Based Authentication in MERN Stack: A Complete Guide

身份验证是 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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板