Alfresco 和 Solr 权限检查

Alfresco and Solr permission checks

下面的代码returns一个大于1000的结果数:

SearchParameters searchParams = new SearchParameters();
searchParameters.setQuery(query);
searchParameters.setSkipCount(0);
searchParameters.setMaxPermissionChecks(1000);
searchParameters.setPermissionEvaluation(PermissionEvaluationMode.EAGER);
searchParameters.setLimitBy(LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS);
ResultSet results = searchService.query(searchParams);

因为我将最大权限检查设置为 1000,所以我没有期望超过 1000 个结果。

要获得预期的结果数,可以使用不同的权限评估:

searchParameters.setPermissionEvaluation(PermissionEvaluationMode.NONE);

问题是 Solr 不会使用其内部权限检查,因此性能会受到影响。

这是预期的行为吗?有没有办法让Solr根据权限过滤结果,同时限制权限评估的次数?

读取访问过滤是通过一个简单的 SOLR 过滤查询完成的,它非常高效,无论匹配 100 条结果还是 100.000 条结果都没有太大区别。由于 SOLR 过滤器查询处理是一个非常 low-level 的操作,可能会在根据相关性对结果进行排序之前发生,因此 Alfresco 也无法在不扰乱 SOLR 执行方式的内部结构的情况下限制“评估”的数量查询。 真正的性能开销来自于这样一个事实,即在这种特殊情况下,请求了一个有效的无界结果页面,导致 1) 显着的传输开销,因为 SOLR JSON 结果必须包含所有匹配结果的 ID,以及 2) Repository-tier 积极处理 SOLR 结果 pre-caches 来自数据库的结果。

通常没有合理使用 LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS 限制,尤其是从 end-user 的角度来看。限制通常应始终基于 LimitBy.FINAL_SIZE(结合 setMaxItems(int)),因为 maxPermissionChecks 在某些时候仍会受到尊重 IF搜索执行,需要涉及 Repository-tier 权限检查(例如,如果启用 security.anyDenyDenies 并且启用 security.postProcessDenies 或 SOLR 本身无法/配置为过滤拒绝,则处理被拒绝的权限)。

TL;DR:这种行为是可以预料的。 LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS 是来自遗留 Lucene 的 left-over 模式,不适用于 SOLR。始终建议还限制通过 setMaxItems(int)

从搜索中返回的项目总数