安全(又名权限)和Lucene - 如何?它应该完成吗?

时间:2009-05-05 07:27:50

标签: security lucene

我的问题的第一个背景。

  • 个别实体可以阅读权限。
  • 如果用户未通过读取权限检查,则无法看到该实例。

问题涉及引入Lucene并执行仅返回匹配实体实例列表的搜索。然后我的代码需要逐个过滤实体。这种方法效率非常低,因为用户可能只能看到少数人,而检查许多人返回的少数人不太理想。

开发人员采用什么方法或如何解决这个问题 - 请记住使用Lucene执行索引和搜索?

修改

解释

  • 用户可能属于多个群组。
  • 角色可能包含许多群组 - 这些群组可能会发生变化。
  • 权限具有角色 - (间接)。
  • X可以具有读取权限。
  • 角色的定义可以随时更改。

索引

  • 在索引时添加组(扩展Permmission)可能会导致定义在角色的成员组列表发生更改时变得不同步。
  • 我希望每当权限/角色的定义发生变化时,都要避免重新索引X.

安全检查

  • 要传递权限检查,用户必须属于属于给定权限的角色的组内的组。

4 个答案:

答案 0 :(得分:7)

这取决于您的上下文中相关的不同安全组的数量以及安全性如何应用于索引数据。

我们遇到了类似的问题,我们通过以下方式解决了这个问题:索引时我们将允许的组添加到文档中,并且在搜索时我们添加了一个布尔查询,其中包含用户所属的组。这在我们的场景中表现良好。

答案 1 :(得分:3)

这取决于您的安全模型。如果权限很简单 - 比如你有三类文档 - 最好为每个类构建一个单独的Lucene索引,并在用户可以看到多个类时合并结果。 The Solr security Wiki建议类似于HakonB的建议 - 将用户的凭据添加到查询中并通过它们进行搜索。 另见this discussion in the Lucene user group。 另一个策略是将Lucene搜索包含在一个单独的安全类中,该安全类可以对Lucene进行额外的过滤。如果您可以使用数据库来执行此操作,则可能会更快。

编辑: 我发现你有一个相当复杂的权限系统。您的基本设计选择是在Lucene内部还是在Lucene外部实现它。我的建议是使用Lucene作为搜索引擎(它的主要优势)并使用另一个系统/应用程序来提高安全性。如果你选择使用Lucene来保证安全,我建议你好好学习Lucene Filters,并使用bitset过滤器来过滤查询的结果。它确实存在您列出的必须更新权限的问题。

答案 2 :(得分:0)

正如Yuval所说,可能值得拥有独立于lucene索引的权限机制。

实现此目的的一种方法是实施您自己的Collector,这将过滤掉用户无权访问的结果。

答案 3 :(得分:0)

我建议有两种文件:

1)Real_documents,其字段名为:“DocumentID”

2)包含字段的安全文档:“Role”“Groups”“Users”“PermisionId”“DocumentsIds”

然后伪代码可能是:

   Field[] docIds =searcher.search("Users", "currentUser").getFields("DocumentIds");
   TermsFilter filter = new TermFilter();

   foreach(field:docIDs){
       filter.add(new Term(field.field(),field.text());
   }
   searcher.search(query.getWeight(searcher), filter, numberOfDocuments);

由于Lucene在搜索两个搜索时非常快,所以很容易制作。通过这种方式,您还可以为每个用户提供更好的tf-idf。