本文讲述如何在sharepoint 2013/2010 中根据当前用户的某个属性过滤搜索结果。
最近客户有一个需求,就是根据用户所在的国家(user info list里面有country字段),在搜索时只显示该用户所在国家的记录(对应的list 有country 字段)。
一般来说sharepoint 搜索是根据当前用户的权限来决定是否可以搜索到对应的记录,但是过是这样的话,需要将列表的所有记录都打破权限记录,这是非常损耗性能的,而且这样的权限结构维护起来很复杂。
本文将使用 来实现,根据微软官方的文档说明,这个接口是用于在返回之前过滤查询结果的:
1. 在管理中心新建一个crawl rule, 必须挂接在某个crawl
rule,只有匹配这个crawl rule的查询结果才会调用 去检查:
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 的用户可以搜索到所有记录:
b. 指定country为us的用户,只能搜索到和us匹配的记录:
8.使用本方案的缺点
a. 用户通过搜索list view等显示有不匹配item的页面,点击进入这些页面后仍然可以看到不匹配item
b. sharepoint 2013 调用isecuritytrimmerpost后不会重新分页,也就是说,本来没有调用isecuritytrimmerpost之前当前页有10条记录,但有5条不匹配当前用户的属性(country),当前用户只能看到五条记录,尽管可能下一页还有内容,sharepoint
2013不会把下也内容补齐到本页,也就是说可能有极端情况当前页的10条记录都不匹配,用户可能在当前页什么都看不到,但可以点下一页,看到有搜索结果。
c.
由于在返回搜索结果给用户之前,需要运行检查搜索记录是否匹配当前用户属性(country)的代码,会降低搜索性能。