【问题标题】:Lucene security search asp.net c#Lucene安全搜索asp.net c#
【发布时间】:2010-09-22 11:24:10
【问题描述】:

我希望这对某人来说是一个非常简单的问题......

基本上,我们在 lucene.net 中针对我的文档索引安全信息,该信息存储在 2 个文档字段中,称为 viewuseridsviewroleids,因此当我们构造查询时- 仅返回用户有权查看的文档。

查询所需的功能是,如果用户属于存储在 viewroleids 中的角色(此位工作正常),我们只希望返回文档,但是如果 viewuserids 字段包含索引上的任何 id(该字段可能不包含任何值),viewroleids 应该被忽略,并且只有存在于 viewuserids 中的用户应该能够查看文档。

如上所述,角色部分按预期工作,但我们需要一些帮助来在 API 中构建术语查询以考虑 viewuserids(有效地覆盖 viewroleids 查询。这是我们目前所拥有的:

BooleanQuery bq = new BooleanQuery();
foreach (int roleId in roleIds)
{
      bq.Add(new TermQuery(new Term("viewroleid", roleId.ToString())),BooleanClause.Occur.SHOULD);
}
bq.Add(new TermQuery(new Term("viewuserid", User.Id.ToString())), BooleanClause.Occur.SHOULD);

提前感谢您的帮助!

注意: 这两个字段都存储在未标记的索引中

【问题讨论】:

    标签: c# asp.net lucene lucene.net


    【解决方案1】:

    有多种方法可以做到这一点,但这里有一种:

    添加一个字段“hasviewuserids”,如果文档有与之关联的任何viewuserids,则该字段包含“TRUE”,否则为“FALSE”。因此,例如,如果当前用户 ID 为 3,并且处于角色 5 和 6 中,则查询将如下所示:

    (+(viewroleids:5 viewroleids:6) +hasviewuserids:FALSE) OR viewuserids:3
    

    【讨论】:

    • 漂亮,我自己也快到了:我认为我需要搜索一个空白的字段(我认为你不能在 lucene 中这样做)所以我更改了索引构建器以添加一个 zzz -zzz-zzz 值到 viewuserid 如果没有用户存在,这样我可以像这样查询索引(使用你的语法): (+(viewroleid:24 viewroleid:6) +viewuserid:ZZZ-ZZZ-ZZZ) OR viewuserid: 100079
    • 我现在只需要使用 API 编写这个...gulp
    • 对于我这样实现的任何感兴趣的人:
    猜你喜欢
    • 2012-12-19
    • 2013-06-24
    • 2011-10-12
    • 2014-03-19
    • 1970-01-01
    • 2012-09-25
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多