本文講述如何在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)的代碼,會降低搜尋性能。