【问题标题】:Role base access control in NodeJsNode Js 中基于角色的访问控制
【发布时间】:2022-01-26 05:29:24
【问题描述】:

我是一个新人,我有一个任务,在我们的项目中,我们有 7 个角色,即

  1. 管理员
  2. 保险公司
  3. 投资者
  4. 客户
  5. 版主
  6. 贷方
  7. 代理

管理员可以访问所有 API,但某些 API 可以由管理员和版主或管理员或保险公司或管理员或投资者等访问。可能有 30 多种排列和组合。有什么简单的方法可以做到这一点吗?任何动态的方法请帮忙。

我写的这段代码是中间件

const isUser = (req, res, next) => {
   if (req.user && req.roles[0].toUpperCase == 'USER') {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};
const isInvestor = (req, res, next) => {
   if (req.user && req.roles[0].toUpperCase == 'INVESTOR') {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};
const isModerator = (req, res, next) => {
   if (req.user && req.roles[0].toUpperCase == 'MODERATOR') {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};
const isAdmin = (req, res, next) => {
   if (req.user && req.roles[0] == 'ADMIN') {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};
const isInsurer = (req, res, next) => {
   if (req.user && req.roles[0].toUpperCase == 'INSURER') {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};
const isNominee = (req, res, next) => {
   if (req.user && req.roles[0].toUpperCase == 'NOMINEE') {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};
const isAgent = (req, res, next) => {
   if (req.user && req.roles[0].toUpperCase == 'AGENT') {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};
const isLender = (req, res, next) => {
   if (req.user && req.roles[0].toUpperCase == 'LENDER') {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};
const isAdminOrInvestor = (req, res, next) => {
   if (req.user && (req.roles[0].toUpperCase == 'INVESTOR'||req.roles[0].toUpperCase == 'ADMIN')) {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};
const isAdminOrInsurer = (req, res, next) => {
   if (req.user && (req.roles[0].toUpperCase == 'INSURER'||req.roles[0].toUpperCase == 'ADMIN')) {
      next();
   } else {
      return res.status(401).send({
         message: `You don't have correct access`,
      });
   }
};

【问题讨论】:

  • 您可以探索 CASL casl.js.org/v5/en。我相信它应该可以处理您的大部分案件。
  • 谢谢@UjwalAgrawal 但我想在后端和 NPM 网站上执行此操作“此软件包已被弃用”此评论显示
  • 据我所知,这个项目还在积极开发中。您可以在github.com/stalniy/casl 访问该库,并且存储库的所有者正在回答问题部分中提出的问题。如果这不适合您的需要,也许您可​​以探索 node-casbin github.com/casbin/node-casbin。我以前没有亲自使用过它,但它有接近 2k 的 GitHub 星数。

标签: node.js angular express rbac


【解决方案1】:

上个月我不得不构建一个类似的东西,我们没有足够的时间来获得另一个外部 npm 包的许可。所以我写了类似的东西

/*Roles.js*/


roles = {
        "admin" : ["route1","route2","route3","route4","route5"],
        "insurer" : ["route4","route5"],
        ...
        }

然后在我的中间件中,我会检查以下内容:

/*middleware.js*/

if(roles[getRoleFromUserId(req.user)].includes(getRoute(req.body.url)))
    next();
else
 {
  return res.status(401).send({
     message: `You don't have correct access`,
  });
}

这很酷,您可以稍后定义角色。您也可以尽早取消访问权限并提供访问权限。

旁注:当您检查用户的角色时,请始终从您的数据库中获取用户的角色。不要依赖请求,除非您使用的是 JWT(我强烈推荐)

【讨论】:

  • 感谢@David Harvey 先生,您能否分享更多代码 sn-ps 以供参考
猜你喜欢
  • 2017-02-06
  • 2010-09-11
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多