当前位置: 首页 > 知识库问答 >
问题:

Expressjs路由:基于角色的路由

贡可人
2023-03-14

我有一个小难题来解决这个问题。

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

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');
      }
    });
}

有什么建议吗?谢谢!

共有1个答案

凌征
2023-03-14

因此,我不确定这是否是您的问题,但需要记住的是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! */ }

 类似资料:
  • 在我的Laravel 5.3设置中,我使用Bouner包,我定义了两个角色,和。登录后,客户将被重定向到,如在App\Http\Controller\Auth\LoginController.php下的中指定的。现在,如果具有角色的用户登录,他也会被重定向到,因为不会对用户角色进行任何区分。我在这里的目标是将管理员用户重定向到。 处理此问题的最佳解决方案是什么?这是我的尝试。 在路由中,在任何中间

  • 我希望使用相同的路由路径,根据用户角色为我的用户加载稍微不同的视图。 以前,我已经加载了基于当前域的不同路由: 这种方法只依赖于子域,子域在创建时可用,因此所有内容都可以是同步的。我必须对用户进行身份验证,根据其角色加载正确的路由,然后导出路由器以初始化vue应用程序。 理想情况下,我可以加载基于用户角色的,,,其中可以包含角色的所有路由定义。 我正在使用Feathers-vuex,但我似乎不能等

  • 我的目标是开发一个单一的骆驼路线来映射这些服务器,接受路径中服务器的名称。类似于这样: 我的(简化且不起作用)Blueprint.xml: 问题是,我不知道如何从路径中移除/center、/north或/south,因此头部被传递给目标服务,而目标服务不知道如何处理它。调用:

  • 尽管我对Angular比较陌生,但它应该是如此简单以至于让我发疯。我使用带有“使用角度路由”选项的CLI创建了一个角度项目。创建了一个功能模块,并使用VS代码中的支架插件(Alexander Ivanichev的“Angular Files”)为其添加了一个路由类。一开始,我只是直接在app.component.html中添加组件选择器,它工作得很好,当我添加了路由器出口,将所有东西连在一起,并将

  • 问题内容: 角度ui路由器的示例演示在起始页面具有以下链接: “ ui-router”的完整网址为或 “关于”的完整网址为或 当我使用durandalJS时,存在一个限制,即默认URL只是“ /”,不能有“ / ui-router”。 Angular ui路由器插件有相同的限制吗? 问题答案: 请参阅此处,默认路由有一个“其他”选项。

  • 我可以检查对象中的值并基于此进行路由吗(就像写到不同的文件一样?)。我可以在pojo中添加注释以避免final json中的字段 我想到了将object转换为json,然后发送到Queue。然后我可以使用jsonpath进行条件路由。但是,我怎样才能从final JSON中省略一个字段呢?