我在后端使用nodejs,expressjs。我正在尝试创建一个简单的web应用程序与基于角色的访问控制,但我不确定我正在做的方式是否正确/推荐的方式。
我有三个角色,分别是超级管理员,管理员和用户,我是这样做的:
const checkRoleMiddleware = (req, res, next) => {
const getPostUserId = getPostFromDb(req.params.postId);
const getPostUserData = getPostUserFromDb(getPostUserId);
if(req.user.id === getPostUserData.id){
/* next */
}else if(req.user.permission === 'admin'){
if(/* Check some other things & compare some other things */){
/* next */
}else{
/* return unauthorized */
}
}else if(req.user.permission === 'super admin') {
/* next */
}else{
/* return unauthorized */
}
};
/* use checkRoleMiddleware on this route*/
app.post('/user/post/edit/:postId', checkRoleMiddleware, (req,res) => {
/* Do something */
});
这是安全的,正确的/推荐的方式做角色基础访问控制在express App?如果我有更多的角色,我必须创建更多的if语句吗?还有其他更好的方法吗?
我可以提出三种不同的方法来解决这个问题(除了你现在的方法--因为这也是一种正确的方法)
选项1您可以为每个组(super admin-2,admin-1,user-0)分配一个整数值,对于基于角色的访问控制,只需检查users组值是否高于分配值。
选项2如果希望允许不同的角色执行不同的操作,可以为每个操作存储一个允许的角色/角色ID数组,并检查其中是否包含用户角色。
选项3您可以将操作角色/用户角色存储为二进制值。例如,您将1分配给user,2分配给admin,4分配给super admin,8分配给super super admin。这样,如果您将数字9分配给user,它们将同时是user和SUPER SUPER ADMIN,允许您在项目中更灵活地使用角色。您还可以允许特定角色执行特定操作,因此,例如,如果您希望操作仅由admin和更高级别执行,则可以为它们分配一个值14(2+4+8)。