业务数据目录安全修整程序

Microsoft Office SharePoint Server 2007 中的 Microsoft Office SharePoint Server 2007 企业级搜索使用爬网时获取的安全信息执行搜索结果的查询时安全修整。但是,有时这么做还不够,例如,当后端应用程序无法在爬网时提供安全信息时,或者您需要最新的安全信息、但每次执行爬网又不现实。为了解决这个问题,企业级搜索查询处理引擎提供了一个用来插入动态查询时安全修整模块的框架;使用该模块,可在单一用户查询的特定结果在搜索结果中显示之前对其执行安全修整。

业务数据目录可实现 CheckAccess 接口,为逐实体实例安全修整或实体实例级安全性提供内置支持。

业务数据目录安全修整程序允许在返回用户之前对已由业务数据目录创建索引的实体实例(搜索文档)执行自定义安全修整。它会使用后端应用程序中的逻辑确定用户的权限,基于当前用户对于后端数据的权限、在执行时修整结果集(包含实体实例)。我们假定实际的后端应用程序将提供一个公共方法,来检查当前用户对于一个或多个实体实例的权限。该方法的输入参数应接受要检查的 EntityInstance 对象的 ID,且输出参数应作为对应的 long 整数数组(或者某个能够转换为 long 整数的值)返回当前用户的访问权限。

当此类 API 可以使用后,业务数据目录元数据的作者可在应用程序定义文件中定义一个名为 AccessChecker 的 MethodInstanceType,并将其映射到后端 API,具体方式与 Finder、SpecificFinder 等类似。当 AccessChecker 方法实例可以使用后,业务数据目录安全修整程序可利用它,通过 CheckAccess 方法确定用户的权限。

每当查询引擎返回的搜索结果与业务数据目录安全修整程序关联爬网规则相匹配时,业务数据目录安全修整程序便执行 CheckAccess 方法。调用 Entity.CheckAccess 方法时,业务数据目录会反过来执行为该实体注册的 AccessChecker 方法实例所描述的后端 API。该后端 API 返回当前用户对于实体实例的权限。此信息将被中继回 Entity.CheckAccess 方法,最后回到安全修整程序;它会使用此信息修整结果,然后再向用户显示结果。

内部详细信息

业务数据目录安全修整程序将 ISecurityTrimmer.CheckAccess(IList<String>, IDictionary<String, Object>) 方法映射到 Entity.CheckAccess([], LobSystemInstance) 方法,具体方式为:在确定 LobSystem 对象和每个 URL 的来源实体之后,将查询处理器提供的 URL 分析到 Entity.CheckAccess 方法中。

但是,因为 ISecurityTrimmer.CheckAccess 必须返回一个“Yes”或“No”值的数组,并且 Entity.CheckAccess 方法会返回一个权限矢量数组,业务数据目录安全修整程序提供了一种方法,可通过读取名为 DisplaySearchResultRightsMaskPropertyName 的实体对象上的一个特殊属性来将权限矢量转换为“Yes”或“No”值。

最后,业务数据目录安全修整程序会尝试限制它为单个搜索查询对象模型调用执行的访问权限检查的次数。例如,如果索引包含一百万个文档,且所有文档都有一个共同的关键字,用户运行了一个类似的查询,但用户只对第一百万个文档具有访问权限,而没有其他文档的访问权限,查询处理器会不断调用 Entity.CheckAccess,直至所有文档都经过测试。这需要很长时间。因此,业务数据目录安全修整程序会通过自定义的可配置限制(默认为 100)跟踪经过检查的文档数量。如果超出此限制,它会引发异常,向最终用户显示一条要求缩小查询范围的信息。

See Also

概念

演练:使用业务数据目录安全修整程序修整搜索结果

AccessChecker 示例