正确的记录访问的实现(The right record access implementation)

2019-07-05 05:08发布

我期待到索引引擎,具体的Apache Lucene的Solr的。 我们愿意用它为我们的搜索,但通过我们的框架搜索解决的问题之一是行级访问。

Solr的不提供开箱记录访问:

<...>的Solr不符合安全无论是在文件级或通信水平关注自身。

而在有关文件级安全性的部分: http://wiki.apache.org/solr/SolrSecurity#Document_Level_Security

有一些建议 - 无论是使用集成块CF(这是高度在一个预测试很阶段无证,似乎)或编写自己的请求处理程序/搜索组件(即部分被标记为存根) - 我想,以后人们就必须对性能的影响更大。

所以,我认为没有多少在这一领域正在做。

在最近发布的4.0版本的Solr,他们已经推出了连接两个索引实体。 加入似乎是一个不错的主意,因为我们的框架也做了一个连接知道记录是否是用户访问。 这里的问题是,有时我们做一个内部联接,有时和外部(取决于乐观(一切有什么不禁止即自由)或悲观(什么是明确允许的一切都只是禁止)的范围内的安全设置)。

为了给出一个更好地了解我们的结构是这样的:

文件

DocumentNr | Name
------------------
1          | Foo
2          | Bar

DocumentRecordAccess

DocumentNr | UserNr | AllowRead | AllowUpdate | AllowDelete
------------------------------------------------------------
1          | 1      | 1         | 1           | 0

因此,例如,在悲观的安全设置文档生成的查询将是:

SELECT * FROM Documents AS d 
INNER JOIN DocumentRecordAccess AS dra ON dra.DocumentNr=d.DocumentNr AND dra.AllowRead=1 AND dra.UserNr=1

这将只返回foo的,但不是吧。 而在乐观的设置:

SELECT * FROM Documents AS d 
LEFT JOIN DocumentRecordAccess AS dra ON dra.DocumentNr=d.DocumentNr AND dra.AllowRead=1 AND dra.UserNr=1

返回两个 - 在Foo和酒吧。

说回我的问题 - 也许有人已经做到了这一点,并可以分享他们的见解和经验?

Answer 1:

恐怕这里没有简单的解决方案。 你将不得不牺牲一些东西来获得的ACL与搜索合作。

  1. 如果你的文集尺寸小(我想说高达10K的文件),你可以创建一个缓存位设置的禁止(或允许,任何一个更简洁)文件,并发送相关过滤查询(+*:* -DocumentNr:1 ... -DocumentNr:X) 不用说,这并不规模。 发送大型查询将使搜索慢一点,但是这是可以控制的(高达当然点)。 查询解析便宜 。

  2. 如果你能以某种集团这些文件和应用文件上的ACL组,这将允许在切割查询长度和上面的方法将伏贴。 这是相当多的,我们用的是什么-我们的解决方案实现了分类,并有通过做分类权限fq查询。

  3. 如果您不需要显示整个结果集数,你可以运行查询和过滤结果在客户端设置。 再次,不完美。

  4. 您也可以非规范化的数据结构和存储这样一个单一的文件中夷为平地两个表:

    DocumentNr:1
    产品名称:富
    Allowed_users:U1,U2,U3(或Forbidden_​​users:...)

    其余的是为发送用户ID与您的查询一样简单。

    以上是唯一可行的,如果ACL是很少变化你能负担得起重新索引整个语料库当他们这样做。

  5. 你可以写这将缓存的自定义查询过滤器BitSet用户允许或禁止的文件的S(组?)从数据库中检索。 这不仅需要提供Solr的web应用程序数据库访问,但也延长/重新包装附带的Solr将.war。 虽然这是比较容易的, 困难的部分是缓存失效 :当ACL的数据得到改变主要的应用程序应该以某种信号Solr的应用程序。

选项1和2可能是比较合理的,如果你可以把Solr的和您的应用程序在同一个JVM和使用javabin驱动程序。

这很难不知道胼/ ACL的细节劝告更多。



Answer 2:

我与mindas同意,他已经建议了什么(SOL-4),我已经实现了我的解决方案以同样的方式,但不同的是,我有一些不同类型的ACL。 在用户组级别,用户级别甚至是文件级太(私有访问)。

该解决方案是工作的罚款。 但在我的情况下,主要的问题是访问控制列表被频繁改变,需要在索引更新,意味着同时搜索性能应该不会被影响了。

我试图用负载均衡来管理这一点,并添加几个节点到群集中。

mindas,宇宙大帝能否请您把您的想法吗?



文章来源: The right record access implementation
标签: solr lucene