security - 索引 Sitecore 项目安全并限制返回的搜索结果

标签 security solr lucene sitecore sitecore7

我定义了多个角色,每个角色对内容和媒体项目都有不同的限制,我想根据当前登录用户的访问权限限制返回的搜索结果,而不是显示结果和用户然后出现“拒绝访问”页面。某些内容显然可以被 Extranet\anonymous 访问,因此无论如何都应该将它们返回给所有用户。

安全遵循标准Sitecore practices因此将使用角色继承(角色内的角色),因此也需要考虑到这一点。

我在 Advanced Database Crawler module 中看不到任何内容这会有所帮助,我已经浏览了 Sitecore 搜索和索引指南( version 6.6version 7 ),但找不到任何有关对应用于项目的安全性进行索引的信息。以下文章提供了一些建议:

这感觉“脏”,并且可能会出现性能问题,特别是当退回大量商品时。另外,(请参阅评论)分页结果的问题。

上面看起来更现实,并且会根据索引的安全角色过滤结果,显然需要扩展角色来处理角色内的角色。我在这里担心的是,当我们特别需要拒绝/限制某些角色对内容项的访问时,我们需要处理拒绝的权限(我知道这不是推荐的做法,但有一个非常具体的需要始终拒绝)。

我目前正处于规划阶段,因此随着今天发布的 Sitecore 7,也可以使用更新的 Lucene 库和/或 SOLR(如果这能让生活更轻松)——当然假设某些模块像WebForms for MarketersEmail Campaign Manager更新时间太短了。

考虑到安全性,人们使用哪些解决方案来返回搜索结果?除了上面链接的问题之外还有其他选择吗?也许我可以利用 Sitecore 7 中的一些东西,更新的 Lucene 库或 SOLR?

我宁愿保留这一切“开箱即用”的 Sitecore,并且尽可能不使用其他第三方搜索产品。

最佳答案

克劳斯建议的一个小替代方案:

Sitecore.ContentSeach.config 中,您将找到一个名为 contentSearch.getGlobalSearchFilters 的管道

添加到此管道的处理器将应用于任何查询,因此,如果我们添加一个基于角色应用过滤器的处理器,那就太好了。

计算字段

首先,我们希望将计算字段添加到我们的索引配置中:

<fields hint="raw:AddComputedIndexField">
   <field fieldName="read_roles"           returnType="stringCollection">Sitecore.ContentSearch.ComputedFields.ReadItemRoles,Sitecore.ContentSearch</field>
</fields>

注意存储的类型是字符串的集合。我们将使用它来索引可以读取项目的所有角色名称。

实现

  1. 我们有一个基本抽象类来处理项目安全详细信息的提取

    public abstract class ItemPermissions: IComputedIndexField
    {
        public string FieldName { get; set; }
        public string ReturnType { get; set; }
    
        public object ComputeFieldValue(IIndexable indexable)
        {
            var indexableItem = indexable as SitecoreIndexableItem;
            if (indexableItem == null) return null;
    
            var security = indexableItem.Item.Security;
    
            return GetPermissibles(security);
        }
    
        protected abstract object GetPermissibles(ItemSecurity security);
    }
    
  2. 我们用抽象方法实现上述内容

    public class ReadItemRoles : ItemPermissions
    {
        protected override object GetPermissibles(ItemSecurity security)
        {
            var roles = RolesInRolesManager.GetAllRoles();
            return roles.Where(security.CanRead).Select(r => r.Name);
        }
    }
    

注意这里显然会对性能产生影响,这会降低您的索引速度。 要减少影响,请仅将计算字段添加到包含 protected 内容的索引的索引配置中。例如。如果您的网络内容仅由匿名用户访问,则不会带来任何好处。

管道

将条目添加到配置中

<contentSearch.getGlobalSearchFilters>
    <processor type="Sitecore.ContentSearch.Pipelines.GetGlobalFilters.ApplyGlobalReadRolesFilter, Sitecore.ContentSearch" />
  </contentSearch.getGlobalSearchFilters>

实现

实现管道过滤器来检查上下文用户的角色

public class ApplyGlobalReadRolesFilter : GetGlobalFiltersProcessor
{
    public override void Process(GetGlobalFiltersArgs args)
    {
        var query = (IQueryable<SitecoreUISearchResultItem>)args.Query;

        var userRoles = Context.User.Roles.Select(r => r.Name.Replace(@"\", @"\\"));

        var predicate = PredicateBuilder.True<SitecoreUISearchResultItem>();
        predicate = userRoles.Aggregate(predicate, (current, role) => current.Or(i => i["read_roles"].Contains(role)));

        if(predicate.Body.NodeType != ExpressionType.Constant)
            args.Query = query.Filter(predicate);
    }
}

摘要

  1. 创建一个 ComputedField,返回给定访问权限的所有有效角色的列表
  2. 将管道处理器应用于 contentSearch.getGlobalSearchFilters,以向每个搜索请求添加查询过滤器。
  3. 使用 PredicateBuilder 类确保角色名称通过 OR 组合在一起

这里的最大好处是,您可以在索引时进行命中,并且项目限制的处理是通过搜索查询正常进行的。无需担心构面数字或搜索计数不正确。

您可以限制正在检查以计算字段的角色,并且可以改变管道过滤器的应用。您甚至可以取出管道过滤器,并在需要时更新您的查询以进行过滤。

注意此设置的最大问题是当安全限制发生变化时需要重新索引您的内容。如果您要对用户本身应用安全限制,则必须包含其他计算字段。

编辑 02/06/2013

我只是在一个项目中对此进行了修改,并意识到它是对查询中的角色进行“与”操作。如果用户分配了多个角色,则这两个角色都必须声明对该项目的权限。我已更新管道处理器以使用 PredicateBuilder类或角色。还添加了检查以确保谓词不是常量,这确保仅当我们有要应用的过滤器时才会更新查询。

关于security - 索引 Sitecore 项目安全并限制返回的搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16683487/

相关文章:

java - ElasticSearch JAVA API 查找给定索引的别名

database - Sitecore Lucene : re-index child (or parent) items on updating item

Java Security - RSA 公钥和私钥代码问题

mongodb - 使用本地 key MONGODB 启用数据加密时出错

Solr:基于字段的存在而提升,忽略该字段的内容

java - 构建具有搜索功能的文档存储

php - 如何防止 PHP 中的 SQL 注入(inject)?

ruby-on-rails - Heroku Ruby 和 YAML 解析命令行检查潜在安全漏洞

apache - 将 Solr (4.8.1) 指向目录 (Windows 7)

java - 尝试在java中实现Google的 "did you mean"功能