我需要某种专家意见才能在Express js中实现“角色和权限”。我计划使用Express js开发Restful Api,但没有足够的信息来实现Roles和Permission,尽管有大量的选项可用于身份验证和授权。

最佳答案

创建表

首先,您需要创建表来保存角色,权限和资源之间的关联:

  • 创建角色表(“管理员”,“用户”,“ guest ”)
  • 创建资源表(“用户”,“项目”,“程序”)
  • 创建权限表(“创建”,“读取”,“写入”,“删除”,“拒绝”)
  • 使用所有三个表作为源
  • 创建一个联结表

    权限表可能不需要这种粒度,但是有些人喜欢它。例如,您实际上并不需要'Deny',因为您只需检查Read!= true。

    现在,当您需要角色对资源的权限时,只需查找role_id和resource_id并检查将哪些权限设置为true。

    创建中间件

    由于您使用的是Express,因此中间件将很容易添加。例如,假设您有一个称为用户的路由器:
    users.post('/', getAuth, handleUserPost)
    

    假设您在请求上具有某种 token ,可以标识发布该帖子的用户,并将用户实例附加到请求对象,则可以执行以下操作:
    getAuth = function (req, res, next) {
      if(req.user) {
        db.getPerms({role_id: req.user.role_id, resource_id: req.resource.id})
           .then(function(perms){
              var allow = false;
              //you can do this mapping of methods to permissions before the db call and just get the specific permission you want.
              perms.forEach(function(perm){
                  if (req.method == "POST" && perms.create) allow = true;
                  else if (req.method == "GET" && perms.read) allow = true;
                  else if (req.method == "PUT" && perms.write) allow = true;
                  else if (req.method == "DELETE" && perm.delete) allow = true;
    
              })
              if (allow) next();
              else res.status(403).send({error: 'access denied'});
           })//handle your reject and catch here
       } else res.status(400).send({error: 'invalid token'})
    }
    

    该代码仅在该示例中进行了粗略介绍,因此我不会复制并粘贴它,但是它应该为您提供正确的想法。

    关于node.js - 在Express REST Api中实现角色和权限的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38893178/

    10-16 19:40