【问题标题】:Security (aka Permissions) and Lucene - How ? Should it be done?安全性(又名权限)和 Lucene - 如何?应该这样做吗?
【发布时间】:2009-05-05 07:27:50
【问题描述】:

首先介绍一下我的问题的背景。

  • 单个实体可以拥有读取权限。
  • 如果用户未能通过读取权限检查,他们将看不到该实例。

该问题涉及引入 Lucene 并执行搜索,该搜索仅返回匹配实体实例的列表。然后,我的代码将需要一一过滤实体。这种方法效率极低,因为存在这样的情况:用户可能只能看到一小部分,而检查许多以返回少数并不理想。

开发人员将使用什么方法或如何解决此问题 - 请记住,索引和搜索是使用 Lucene 执行的?

编辑

定义

  • 一个用户可能属于多个组。
  • 一个角色可能有很多组 - 这些可以更改。
  • 权限具有角色 -(间接)。
  • X 可以拥有读取权限。
  • 角色的定义可以随时更改。

索引

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

安全检查

  • 要通过权限检查,用户必须属于一组组中的组,该组属于给定权限的角色。

【问题讨论】:

    标签: security lucene


    【解决方案1】:

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

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

    【讨论】:

    • 可能我们做了非常相似的事情:被索引的对象在元数据字段中具有组 id:s 具有读取权限:“G1、G6、G203”,并且搜索的目标只是“包含 G1 或 G70” ”。还通过使用不同的前缀扩展到用户。
    • 我的思路是一样的,下面是我的具体实现:lifeinide.blogspot.com/2013/02/…
    【解决方案2】:

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

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

    【讨论】:

    • 在我的原始答案中添加了详细信息。 HTH
    【解决方案3】:

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

    一种方法是实现您自己的Collector,这将过滤掉用户不应访问的结果。

    【讨论】:

      【解决方案4】:

      我建议有两种文件:

      1) 具有名为“DocumentID”的字段的 Real_documents

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-11
        • 2013-07-17
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        相关资源
        最近更新 更多