天天看点

SharePoint 2013/2010 根据当前用户的某个属性过滤搜索结果

本文讲述如何在sharepoint 2013/2010 中根据当前用户的某个属性过滤搜索结果。

最近客户有一个需求,就是根据用户所在的国家(user info list里面有country字段),在搜索时只显示该用户所在国家的记录(对应的list 有country 字段)。

一般来说sharepoint 搜索是根据当前用户的权限来决定是否可以搜索到对应的记录,但是过是这样的话,需要将列表的所有记录都打破权限记录,这是非常损耗性能的,而且这样的权限结构维护起来很复杂。

本文将使用  来实现,根据微软官方的文档说明,这个接口是用于在返回之前过滤查询结果的:

1. 在管理中心新建一个crawl rule,  必须挂接在某个crawl

rule,只有匹配这个crawl rule的查询结果才会调用 去检查:

SharePoint 2013/2010 根据当前用户的某个属性过滤搜索结果

2. 启动一个 full crawl (否则crawl rule不会生效)

3. 新建一个sharepoint farm solution, 命名为 customsecurityposttrimmer

4. sharepoint list item搜索结果的地址格式为 

sts4://msstoresp12013/siteurl=sites/ap/siteid={cb7ed81a-cce4-4b54-83a8-3b1eadcf2611}/weburl=/webid={199327ad-b16a-4c92-86cd-ec684c847234}/listid={39c30ef9-80c4-46bf-b391-028681191ca0}/folderurl=/itemid=22

这个地址不是程序可以理解的地址,因此需要创建一个sts4adress类来解吸这个地址  sts4adress.cs: 

4. 创建customsecurityposttrimmer 来实现 isecuritytrimmerpost, customsecurityposttrimmer.cs:

checkaccess返回的urlstatusarray决定每条记录现实与否,true,表示现实, flase表示不现实

5. 部署改解决方案

6.注册customsecurityposttrimmer,以管理员身份运行sharepoint

2013 management shell, 执行下列命令:

注意替换 publickeytoken

customsecuritytrimmersample 为dll 的名

customsecuritytrimmersample.customsecurityposttrimmer为实现了isecuritytrimmerpost的类名

可以通过下列命令来查看客户化的securitytrimmer

可以通过 remove-spenterprisesearchsecuritytrimmer 来删除securitytrimmer,如: 

7. 以不同用户搜索不同的结果: 

a. 没有指定country 的用户可以搜索到所有记录: 

SharePoint 2013/2010 根据当前用户的某个属性过滤搜索结果

b. 指定country为us的用户,只能搜索到和us匹配的记录: 

SharePoint 2013/2010 根据当前用户的某个属性过滤搜索结果

8.使用本方案的缺点

a. 用户通过搜索list view等显示有不匹配item的页面,点击进入这些页面后仍然可以看到不匹配item

b. sharepoint 2013 调用isecuritytrimmerpost后不会重新分页,也就是说,本来没有调用isecuritytrimmerpost之前当前页有10条记录,但有5条不匹配当前用户的属性(country),当前用户只能看到五条记录,尽管可能下一页还有内容,sharepoint

2013不会把下也内容补齐到本页,也就是说可能有极端情况当前页的10条记录都不匹配,用户可能在当前页什么都看不到,但可以点下一页,看到有搜索结果。

c.

由于在返回搜索结果给用户之前,需要运行检查搜索记录是否匹配当前用户属性(country)的代码,会降低搜索性能。

继续阅读