我想要两个访问角色:admin和superadmin。
超级管理员可以创建、读取、更新和删除帖子。管理员可以阅读、更新帖子。
我已经有了中间件:
const verifyAdminStatus = (req, res, next) => {
//pseudocode: if (user === 'admin') next();
}
const verifySuperAdminStatus = (req, res, next) => {
//pseudocode: if (user === 'superadmin') next();
}
对于创建和删除,它运行良好:
router.post("/api/posts", [verifyToken, verifySuperAdminStatus], createPost);
router.delete("/api/posts/:id", [verifyToken, verifySuperAdminStatus], deletePost);
但对于更新和阅读,我不能同时放两个中间件,因为它们中的任何一个都无法访问。如何实现管理员和超级管理员都可以更新和读取的解决方案。我需要创建一个新的中间件来检查两者吗?
您可以使用中间件工厂来只有一个中间件来管理不同的情况,如下所示:
const authMiddleware = (roles) => {
return (req,res,next) => {
roles.forEach(role => {
if(["admin", "superadmin"].includes(role)) return next();
})
return res.status(403).json({
message: "Forbidden"
})
}
}
router.post("/api/posts", [verifyToken, authMiddleware(["Admin"])], createPost);
router.delete("/api/posts/:id", [verifyToken, authMiddleware(["SuperAdmin"]], deletePost);
router.delete("/api/posts/another-endpoint", [verifyToken, authMiddleware(["SuperAdmin", "Admin"]], deletePost);
最后一个端点可以用于管理员或超级管理员角色。