Lucene和访问控制(评论的可见性)

时间:2009-07-07 17:56:31

标签: java security full-text-search lucene hibernate-search

想象一下这个简单的全文搜索场景:带注释的文章。我想在评论中也通过文字搜索文章。仅此一点实施起来相当简单。

并非所有用户都可以看到所有评论。撰写评论的用户也可以限制其对具体角色的可见性(因此评论有2个字段:文本和角色)。

是否可以限制对文章的lucene搜索,使其仅查看当前用户可见的评论(comment.role在当前用户的角色集内)?

如果是这样,请指出我正确的方向我应该怎么做并写下这样的查询(最好)或lucene过滤器。

(我通过hibernate-search使用lucene,但它应该没有区别)

3 个答案:

答案 0 :(得分:2)

根据docs,您可以将您感兴趣的角色作为查询中的另一个字段。在你的例子中,这样的东西应该起作用:

text:"user query" AND role:"userRole"

答案 1 :(得分:0)

添加到joeslice的答案。如果存在角色层次结构,则角色权限将该权限级联到层次结构中的其他角色。例如,如果授予角色“经理”的许可,则导致对“导演”的许可。 “副总统”也是如此。

在这种情况下,您的查询将是

text:"user query" AND (role:"role1" OR role:"role2" OR role:"role3")

答案 2 :(得分:0)

对于这种情况,我想不出任何好的解决方案,但我可以想出一些不好的解决方案......

问题在于lucene并没有真正提供除文档字段机制之外的任何层次结构支持。

您最好的选择是为每条评论创建单独的文档。这样每个文档都有一个“文本”和一个“角色”字段,因此您知道该角色适用于文本。

问题是,现在你没有评论和文章之间的良好关联,所以例如,如果你有一篇文章包含单词“hibernate”,评论中包含单词“lucene”,则搜索“hibernate和lucene”不会找到它。你可以尝试通过将文章和所有注释作为额外字段包含在每个文档中来改进这一点,但是你会有一个非常臃肿的索引,并且可能带来安全隐患。

另一种方法是使用comment1comment2等编号字段。然后,您可以将role1comment1匹配。如果您对某篇文章发表了多条评论,这将使您的查询变得大而且效率低下。