SharePoint服務器端對象模型 之 訪問用戶、用戶組和權限(Part 3)

(三)權限設置web

本節中提供了一個完整的例子進行權限設置,在該例子中,首先建立了一個新的權限級別,以後在某個列表上給一個用戶賦予這個權限級別對應的權限。請留意在程序中權限分配的三個部分是如何體現出來的。程序以下(假設程序中所涉及到的網站、列表和用戶均真實存在):數據庫

   1: using(SPSite site = new SPSite("http://sp2010/book"))
   2: {
   3:   using(SPWeb web = site.OpenWeb())
   4:   {
   5:     SPRoleDefinition newRole = new SPRoleDefinition();
   6:     newRole.Name = "NewRole";
   7:     newRole.Description = "Role to view list items and pages.";
   8:     newRole.BasePermissions = 
   9:       SPBasePermissions.ViewListItems | SPBasePermissions.ViewPages;
  10:     if (!web.HasUniqueRoleDefinitions)
  11:     {
  12:         web.RoleDefinitions.BreakInheritance(true, true);
  13:     }
  14:     web.RoleDefinitions.Add(newRole);
  15:  
  16:     SPList list = web.Lists["Chapters"];
  17:     if (!list.HasUniqueRoleAssignments)
  18:       list.BreakRoleInheritance(true);
  19:     SPRoleAssignment assignment = new SPRoleAssignment(
  20:       web.EnsureUser("CONTOSO\\kaneboy"));
  21:     assignment.RoleDefinitionBindings.Add(
  22:       web.RoleDefinitions["NewRole"]);
  23:     list.RoleAssignments.Add(assignment);
  24:   }
  25: }

程序中在建立權限級別、建立新的權限分配以前,都判斷了當前是否已是自定義的設置,若是不是的話,須要斷開與父網站相應的繼承關係。這裏須要說明的是,在結束權限級別的繼承關係的時候,會自動的結束掉子網站與父網站之間權限分配上的繼承關係,相應方法的兩個bool類型的參數的做用,與結束權限分配方法的參數的做用相似,詳情能夠進一步參考SDK。安全

(四)一個特殊的用戶——系統賬戶服務器

不少用戶在使用SharePoint的時候,可能會以爲很奇怪的一點是:當使用某個賬號(多半是Administrator)登陸SharePoint的時候,會發現SharePoint顯示當前用戶並非咱們剛剛輸入的那個賬號,而是一個名叫「系統賬戶」(System Account)的奇怪賬號。app

實際上,這是由於咱們登陸的賬號是當前Web應用程序所對應的應用程序池的服務賬戶,在SharePoint中,幾乎全部對數據庫的讀取和操做,都是經過這個應用程序池的服務賬戶來進行的,這個賬戶不只擁有對SharePoint全部資源的讀寫權限,也擁有對相應數據庫的徹底控制權限,是一個權限至關大的賬戶。所以,爲了防止「不法之徒」得知這個賬戶後帶來的安全隱患,有必要將這個賬戶「隱藏」起來,所以,這個賬戶不論用戶名是什麼,在SharePoint中一概顯示爲「系統賬戶」。函數

「系統賬戶」的確是一個奇怪的賬號,它的登陸名固定爲「SHAREPOINT\System」,SID固定爲「S-1-0-0」,用戶ID固定爲「1073741823」 (即0x3FFFFFFF)。這一切奇怪之處都代表了這個賬號的特殊,也都是爲了隱藏背後的真正賬號所作的「障眼法」。網站

(五)用戶身份模擬和權限提高spa

在大多數狀況下,在服務器端的代碼都是以當前登陸網站的用戶的身份執行的(在計時器做業程序、某些事件處理程序和某些工做流代碼中,可能不是以當前用戶的身份來執行代碼的,具體詳見相關章節的介紹),然而在一些特殊狀況下,咱們可能須要切換到特定的用戶身份來執行一段程序,或者臨時使用較高的權限來執行某些操做。這個時候,SharePoint也提供了在代碼中進行身份模擬和權限提高的機制。但須要說明的是,不管是身份模擬仍是權限提高,在沙盒解決方案(SandBoxed Solution)中都是不被支持的。設計

一、用戶身份模擬日誌

當咱們須要代碼模擬另外一個用戶的身份進行某些操做的時候,咱們可使用SPSite構造函數的一個重載,並將須要模擬用戶的UserToken做爲參數,以此來獲得使用某個特定用戶構造的上下文。UserToken能夠經過SPUser的UserToken屬性得到。一個示例程序以下:

   1: using(SPSite origSite = new SPSite("http://sp2010/book"))
   2: {
   3:   using(SPWeb origWeb = origSite.OpenWeb())
   4:   {
   5:     // 運行該程序的用戶:
   6:     Console.WriteLine(origWeb.CurrentUser.LoginName);
   7:  
   8:     SPUser user = origWeb.AllUsers["CONTOSO\\Erucy"];
   9:     using(SPSite erucySite = new SPSite("http://sp2010/book",
  10:                                         user.UserToken))
  11:    {
  12:       using(SPWeb erucyWeb = erucySite.OpenWeb())
  13:       {
  14:         // 特定的用戶:
  15:         Console.WriteLine(erucyWeb.CurrentUser.LoginName);
  16:       }
  17:     }
  18:   }
  19: }

經過用戶身份模擬,能夠在代碼中徹底使用某個特定的身份來完成一些操做。此外,用戶身份模擬的代碼並不要求執行者在網站中有特殊的權限,所以在設計應用的時候,須要特別注意,以避免產生惡意訪問。

二、權限提高

在一些程序中,咱們可能須要完成一些比較特殊的操做,而這些操做可能須要較高的權限才能完成(例如記錄日誌、對服務器進行磁盤操做、讀寫數據庫等等),但咱們又不但願直接賦予普通用戶這些權限。此時,咱們可使用權限提高的方式來進行操做。

權限提高是臨時將用戶權限提高至「系統賬戶」的身份來運行,關於「系統賬戶」的描述,請參看以前的章節。

權限提高使用SPSecurity的RunWithElevatedPrivileges靜態方法實現,參數是須要執行的代碼的函數。在權限提高的時候,須要特別注意的是:必須再次建立SPSite和SPWeb對象,使用新建立的網站對象,才能得到權限提高以後的上下文。下面是一個示例:

   1: SPSecurity.RunWithElevatedPrivileges(delegate()
   2: {
   3:   using(SPSite newSite = new SPSite("http://sp2010/book"))
   4:   {
   5:     using(SPWeb newWeb = newSite.OpenWeb())
   6:     {
   7:       Console.WriteLine(newWeb.CurrentUser.LoginName);
   8:       // 執行相應的須要權限的代碼
   9:        // ……
  10:     }
  11:   }
  12: });
一樣的,用戶身份模擬的代碼並不要求執行者在網站中有特殊的權限,並且由於這是一個相對來講比較危險的操做,在設計應用的時候,必定要加以注意,以避免產生惡意的操做,形成安全隱患。
相關文章
相關標籤/搜索