0

我有一个应用程序,文档创建者可以在其中确定要授予的访问权限。权限的形式为:

  1. 每个人 => 1
  2. 我的朋友 => 2
  3. ME_ONLY => 3

例子:

  1. 用户 1 创建 doc1 并将权限设置为 EVERYONE
  2. 用户 2 创建了 doc2 并将权限设置为 ME_ONLY
  3. 用户 3 创建 doc3 并将权限设置为 MY_FRIENDS

在索引中,我们有 creator_ids 代表创建文档的用户列表。例如对于 doc1:creator_ids=[1]

MY_FRIENDS 列表(针对每个文档创建者)由不同的模块确定,可在运行时访问。

一个文档可以由多个用户创建,每个用户独立授予权限。例如:

  1. 用户 4 和 5 创建 doc4。用户 4 将权限设置为 EVERYONE,而用户 5 将权限设置为 ME_ONLY。
  2. 用户 6 和 7 创建 doc5。用户 6 将权限设置为 MY_FRIENDS,而用户 7 将权限设置为 ME_ONLY

对于多个创建者的情况,使用限制较少的权限。例如:

  1. 对于 doc4,压倒一切的权限将是 EVERYONE
  2. 对于 doc5,覆盖权限将为 MY_FRIENDS

我检查了几个讨论,找不到适合上述模型的讨论:

  1. SOLR 权限/根据访问权限过滤结果
  2. https://issues.apache.org/jira/browse/SOLR-1872
  3. https://issues.apache.org/jira/browse/SOLR-1834
  4. http://lucene.472066.n3.nabble.com/Solr-and-Permissions-td2663289.html
  5. Solr 中的细粒度安全性

为了处理安全性,我考虑了两种方法:

  1. 创建一个动态字段(“permissions_*”),为每个文档创建者保留权限。例如:

    a) For doc1 permissions_1=1
    b) For doc4 permissions_4=1 & permissions_5=3
    
    Then a created a runtime method that checks each document permission (s) and decides if user trying to access is allowed.
    
  2. 为每个权限创建一个字段来保存已设置该权限的用户。例如

    a) For doc2 permission_1=[4], permission_2=[] & permission_3=[5]
    b) For doc5 permission_1=[], permission_2=[6] & permission_3=[7]
    
    Then use solr fq query to filter out documents based on permissions. However, I am not an expert in solr, so I still trying to find out how to create such a query.
    

几个问题:

  1. 有没有更好的方法来处理这个?
  2. 这两种方法中的哪一种可以扩展?

提前致谢。

4

1 回答 1

0

首先,您应该将您的权限集建模为 ACL,以便它包含正确的 ACE(如“允许 User_A 朋友”和“允许 User_B Me_Only”)。如果权限频繁更改并且您不想重新索引,您可以选择将此信息与文档一起索引或实施外部(自定义)缓存。您可以实现一个自定义过滤器,该过滤器接收用户(名称、ID 等)并根据您上面提到的规则评估他的权限。如果用户数量和文档数量很大,我建议将其实现为 PostFilter。有关更多信息,请参阅此帖子:http: //java.dzone.com/articles/custom-security-filtering-solr

于 2013-08-08T15:42:40.597 回答