【问题标题】:Expressjs routing : Role based routesExpressjs 路由:基于角色的路由
【发布时间】:2015-11-25 04:45:06
【问题描述】:

我有一个小难题要解决。

我有一个用户和一个管理员角色。

userRoles: ['user', 'admin']

用户应该能够列出除管理员之外的所有用户。管理员可以列出所有用户。

我想到的第一个解决方案是在控制器级别检查角色:

if (req.user.role == 'admin'){list all users}
else{list all except admins}

但我想做的更多是在路由级别上,以保持控制器更清洁,但不知何故它不起作用。即使我以管理员身份登录,它也只会列出用户。

router.get('/', auth.hasRole('user'), controller.index);
router.get('/', auth.hasRole('admin'), controller.getUsers);


function hasRole(roleRequired) {
 if (!roleRequired) throw new Error('Required role needs to be set');

  return compose()
    .use(isAuthenticated())
    .use(function meetsRequirements(req, res, next) {
      if (config.userRoles.indexOf(req.user.role) >= config.userRoles.indexOf(roleRequired)) {
        next();
      }
      else {
        res.status(403).send('Forbidden');
      }
    });
}

有什么建议吗? 谢谢!

【问题讨论】:

  • 我不确定我是否清楚你的问题是什么。您正在使用可选的第二个参数,这就是我为我的游戏处理身份验证的方式。有什么问题吗?
  • 即使我以管理员身份登录,基于路由也只会列出用户。

标签: node.js express


【解决方案1】:

所以,我不确定这是您的问题,但要记住的一件事是 JS 不保证数组的索引(根据 ecmascript 规范),因此您的 >= 测试不可靠。

最好像我在AuthZ 中那样使用位掩码,您可以将权限或角色分配为固定的二进制数,然后您可以对其进行过滤:

// lib/rights.js
module.exports = {
  READ : 1 << 0, // 001
  WRITE : 1 << 1, // 010
  DELETE : 1 << 2 //100
};

// lib/roles.js
var rights = require('./rights');
    module.exports = {
      ADMIN : rights.READ ^ rights.WRITE ^ rights.DELETE,
      MEMBER : rights.READ ^ rights.WRITE,
      GUEST : rights.READ
    };

然后你可以很容易地检查:

if (user.role & resource.rightsRequired) { /* you're in! */ }

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 2012-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多