【问题标题】:Filter subscription bases on user roles in Meteor根据 Meteor 中的用户角色过滤订阅
【发布时间】:2017-10-04 20:31:05
【问题描述】:

我正在使用meteor-roles 包向应用程序添加角色功能。现在我正在尝试根据具有查看该产品类别的角色的用户过滤产品订阅。

我以为我可以使用mongo $where in meteor,但我只能将 $where 函数指定为无法访问角色包的序列化字符串。

将用户添加到角色以查看特定类别的示例。

Roles.addUsersToRoles(userIdA, 'view-product-category', 'product-category-a');

当前代码不起作用。当函数在 mongo 引擎中反序列化时,userId 不存在。

Meteor.publish('products', function () {
  let userId = this.userId;

  let query = {
    $where: function () {
      return Roles.userIsInRole(userId, 'view-product-category', `product-catogory-${this.category}`);
    }.toString();
  };

  return Products.find(query);
});

如何根据值不同的集合过滤集合,我在这里尝试做什么?

目前的方向是自己序列化函数并将所需的值放在那里。我想知道是否有更通用和更强大的方法来对订阅进行这种 acl 访问过滤。

【问题讨论】:

  • 为什么不显示一些代码?这让帮助变得更容易。
  • 我认为这是一个范围界定问题,尽管我自己没有尝试过。你试过var userId = this.userId吗?
  • 如前所述,userId 不存在。 varlet 也没有关系。两个都试过了。将函数序列化为字符串并随后 mongo 反序列化它并使用 eval 执行它时,范围不保持。

标签: meteor filter roles


【解决方案1】:

$where 没有索引并且速度很慢。我相信您要做的是过滤具有类别键的产品。用户拥有多个角色,允许他们查看各种类别。

您希望将查询设置为:

Products.find({category: {$in: userCategories}});

幸运的是,roles api 有一个getRolesForUser 函数,可以为您获取所有用户的角色。

这样做:

const myRoles = getRolesForUser(Meteor.userId());
const userCategories = f(myRoles); // whatever you need to do to format these roles as categories
Products.find({category: {$in: userCategories}});

我不清楚你的角色是如何参与其中的,因此是伪答案。但基本上你希望userCategories 成为用户有权访问的类别名称的array。只要category 字段被索引,这个查询就会很快。

【讨论】:

  • 是的,这就是我目前使用的选项。将role permission 放在收藏品本身上。是否也推荐用于查看/编辑项目等精细权限?
  • 这感觉有点矫枉过正,但我​​不知道您的业务规则是什么。我尝试确保将 CRUD 权限抽象为一小组核心角色,然后使用记录所有权或“成员资格”来控制文档级权限。顺便说一句,这种方法对您有用吗?
  • 是的,我已经为集合中的每个项目添加了权限。这是必要的,因为每个项目都可以由不同的人编辑和查看。我本可以去实现组权限。但在这种情况下,这些组将与集合中的项目一一对应。
  • 如果该方法有效,那么您应该接受答案,还是仍然坚持使用 $where 运算符?
猜你喜欢
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多