我可以将Easy Search限制为仅返回已发布的数据吗?

时间:2015-11-25 18:50:59

标签: security search meteor

我正在使用matteodem的Easy Search软件包,并且刚刚发现,搜索可以访问整个集合,而不是仅返回已发布的文档。

我通过设置我的发布函数来返回一个空数组,然后检查控制台中的MyCollection.find()。fetch()是否正确返回[]来测试这个。但是,使用Easy Search搜索MyCollection仍会返回集合中的所有匹配文档。

有没有办法确保Easy Search只将允许的数据传递给客户端?我在文档中找不到任何内容。

2 个答案:

答案 0 :(得分:3)

Easy Search 正在具有通用访问权限的服务器上运行搜索。根据{{​​3}},您可以设置默认选择器,以按某些条件过滤搜索。在您的情况下,您只需从正常出版物(出版物中的第一个参数find())复制选择器,并将其设置为 Easy Search 的默认选择器。

let index = new EasySearch.Index({
  collection: someCollection,
  fields: ['name'],
  engine: new EasySearch.Minimongo({
    sort: () => ['score'], // sort by score
    selector: function (searchObject, options, aggregation) {
      // selector contains the default mongo selector that Easy Search would use
      let selector = this.defaultConfiguration().selector(searchObject, options, aggregation);

      // modify the selector to only match documents created by the current user 
      selector.createdBy = this.userId || options.search.userId; // to run on both client and server
      return selector;
    }
  })
});

答案 1 :(得分:1)

来自matteodem,Easy Search的开发人员,我对如何确保只搜索返回已发布数据的原始问题有一个简单的答案。

最简单的方法是使用Minimongo等客户端搜索引擎。这将通过您的出版物访问数据,因此将准确查看您已发布的数据,不多也不少。不需要选择器。

示例代码:

postsIndex = new EasySearch.Index({
  collection: Posts,
  fields: ['name', 'tags', 'created_by_username'],
  defaultSearchOptions: {
    limit: 6
  },
  engine: new EasySearch.Minimongo() // search only on the client, so only published documents are returned
});

或者,您可以使用服务器端搜索引擎,例如MongoDB。在这种情况下,您应该添加一个选择器来控制返回的数据。

不幸的是,我无法让选择器与MongoDB一起工作。你不能使用Meteor.userId(),因为代码在服务器和客户端都运行,当我在文档中尝试这个配方时,我在服务器上看到一个错误。使用Michel Floyd的构造,options.search.userId存在但是为null。如果我发现如何做,我会更新这个答案的完整性。