(二)權限相關對象安全
一、用戶(SPUser)網站
SharePoint中使用SPUser表示用戶(和域組),使用SPUserCollection表示用戶集合。spa
獲取一個用戶大體有以下幾種方式:對象
(1) 使用SPWeb的CurrentUser屬性獲取當前用戶,即當前上下文中的用戶;繼承
(2) 使用SPWeb的EnsureUser(string loginName)方法,該方法會根據參數中的登錄名判斷網站中是否有該用戶存在,若是有的話直接返回;若是沒有的話,會將用戶添加到網站中(可是不分配任何權限),而後再返回這一用戶。不過該方法在運行的時候須要有網站集管理員的權限。索引
(3) 使用SPWeb的Users屬性(SPUserCollection)獲取網站中的用戶集合,這個屬性獲取到的是直接在該網站中分配了權限,以及經過SharePoint用戶組分配了該網站權限的那些用戶;接口
(4) 使用SPWeb的AllUsers屬性(SPUserCollection)獲取網站中的用戶集合,這個屬性除了獲取到Users屬性中的用戶以外,還包含了那些經過AD域組加入到該網站中的那些用戶(不過前提條件是這個用戶曾經訪問過這個網站);ip
(5) 使用SPWeb的SiteUsers屬性(SPUserCollection)獲取網站集中的用戶集合,這個屬性除了可以獲取到上述用戶以外,還包含了那些沒有在當前網站中分配過權限,可是在網站集的其餘網站中被分配了權限的用戶;ci
(6) 使用SPGroup的Users屬性(SPUserCollection)獲取用戶組中包含的用戶的集合。文檔
在(3)-(6)方法中,都是先獲取到SPUserCollection用戶集合,以後能夠經過以下方法從用戶集合中獲取某個特定的用戶:
(1) Users[idx]:int型索引器,根據下標獲取用戶,比較少用;
(2) Users[loginName]:string型索引器,根據用戶的登錄名獲取用戶,是一種很是經常使用的方法;
(3) 使用集合的GetByID(id)方法,根據用戶的ID(網站集惟一的整型ID)獲取用戶,也是一種比較經常使用的方法;
(4) 使用集合的GetByEmail(email)方法,根據用戶的郵箱獲取用戶。
須要說明的是,用戶對象在網站集中是惟一的,這意味着一個用戶在一個網站集內擁有相同的ID、顯示名稱、電子郵件等等;在不一樣的網站集中,同一個用戶可能擁有不一樣的ID、顯示名稱和電子郵件等信息。可是登錄名稱則是全局惟一的。
SPUser中的一些經常使用屬性以下:
名稱 |
類型 |
說明 |
|
string |
用戶的電子郵箱 |
Groups |
SPGroupCollection |
用戶所在的用戶組 |
ID |
int |
用戶的ID(網站集惟一) |
IsDomainGroup |
bool |
是不是AD域組(或角色) |
IsSiteAdmin |
bool |
用戶是不是網站集管理員[1] |
LoginName |
string |
用戶登錄名(全局惟一) |
Name |
string |
用戶顯示名稱(網站集惟一) |
Sid |
string |
安全ID(全局惟一且建立後不可更改) |
UserToken |
SPUserToken |
用戶令牌 |
[1]判斷一個用戶是不是網站集管理員須要有相應的權限,換句話說,當一個普通用戶執行程序的時候,任何一個用戶的IsSiteAdmin屬性都是false;只有當以管理員的身份執行程序的時候,才能正確判斷出哪些用戶是網站集管理員,哪些用戶不是。
二、用戶組(SPGroup)
用戶組是一組用戶的集合,用戶組自己不可嵌套(用戶組中不能夠包含用戶組,可是能夠包含AD域組)。在SharePoint中,用戶組主要用於將一批用戶統一組織起來,便於管理,但其自己並不具備組織結構的性質和功能。SharePoint中使用SPGroup表示用戶組,使用SPGroupCollection表示用戶組的集合。
獲取用戶組的方式大體有以下幾種:
(1) 使用SPWeb的Groups屬性,獲取在該網站中設置了權限的用戶組集合;
(2) 使用SPWeb的SiteGroups屬性,獲取定義在整個網站集中的全部用戶組集合;
(3) 使用SPUser的Groups屬性,獲取用戶所屬的用戶組集合。
上述方法都是獲取到SPGroupCollection這一用戶組集合對象,以後再經過以下方法能夠獲取某個指定的用戶組:
(1) Groups[idx]:int型索引器,使用下標獲取,不多使用;
(2) Groups[name]:string型索引器,根據用戶組名稱獲取,最經常使用的方法;
(3) 使用集合的GetByID(id)方法,根據用戶組ID(網站集惟一)獲取。
與用戶相似,用戶組也是網站集範圍的設置,用戶組在網站集中擁有一樣的ID和名稱。與用戶不一樣的是,用戶組只能在網站集的級別上定義,沒法建立只針對於某個網站的用戶組(可是能夠將這一用戶組只在某一個網站上分配權限)。
SPGroup的一些經常使用屬性以下:
名稱 |
類型 |
說明 |
ContainsCurrentUser |
bool |
用戶組是否包含當前用戶 |
ID |
int |
用戶組ID(網站集惟一) |
Name |
string |
用戶組名稱 |
Users |
SPUserCollection |
用戶組中包含的用戶 |
三、權限(SPBasePermission)
權限是指具體的用戶行爲,好比添加列表條目、刪除列表條目、管理列表、查看頁面等等。在SharePoint中使用SPBasePermission枚舉來表示這些權限。
該枚舉使用2進制位的方式表示每一種單獨的權限,在表示多個權限組合的時候,能夠將其進行按位或操做,例如須要表示「添加列表條目和查看列表條目」的權限,則可使用「SPBasePermission.AddListItems | SPBasePermission.ViewListItems」的方式。
在該枚舉中,包含兩個特殊的值,即EmptyMask和FullMask分別表示空權限和全部權限,便於用戶使用。此外,權限自己是沒法被擴展的。
四、權限級別(SPRoleDefinition)
權限級別主要用於描述一組權限的集合,能夠將一系列權限定義爲一個相似「角色」的對象,例如「讀取」權限級別中就包含了查看項目、打開項目、查看版本、查看頁面、查看應用等一組權限。在SharePoint中,使用SPRoleDefinition定義權限級別,使用SPRoleDefinitionCollection定義權限級別的集合。
因爲權限級別是定義在網站級別,所以在獲取權限級別對象的時候,是使用SPWeb的RoleDefinitions屬性獲取權限級別的集合,以後使用defs[name]的string型索引器,根據權限級別的名稱獲取某個特定的權限級別。
SPRoleDefinition的一些經常使用屬性以下:
名稱 |
類型 |
說明 |
BasePermissions |
SPBasePermission |
權限級別包含的具體權限 |
Id |
int |
權限級別的ID |
Name |
string |
權限級別的名稱 |
五、權限分配(SPRoleAssignment)
權限分配是SharePoint權限體系中的核心對象,全部和受權相關的操做大部分都是經過權限分配對象來完成的。在SharePoint中,使用SPRoleAssignment表示權限分配,使用SPRoleAssignmentCollection表示權限分配的集合。
獲取權限分配的方式主要是先從分配權限的對象上獲取權限分配的集合,經過使用SPWeb、SPList或SPListItem的RoleAssignments屬性,獲得權限分配的集合,以後通常經過集合的GetAssignmentByPrinciple(SPPrinciple principle)方法,根據用戶或用戶組獲得分配在該對象上的某個特定用戶或用戶組的權限。這個方法參數的SPPrinciple類型,是SPUser和SPGroup的共有的父類。
正如上一篇的圖中所展現的,權限分配包括三大部分,這三部分在SPRoleAssignment的屬性中就有所體現:
權限分配的對象:ParentSecurableObject屬性(SPSecurableObject類型);
權限分配的用戶:Member屬性(SPPrinciples類型);
分配的權限級別:RoleDefinitionBindings屬性(SPRoleDefinitionBindingCollection類型,用法和SPRoleDefinitionCollection相似)。
而這三個屬性,也正是SPRoleAssignment的所有屬性。
六、SPSecurableObject類
在SharePoint 2010中,凡是可以被分配權限的對象(包括SPWeb,即網站;SPList,即列表;SPListItem,即列表條目、文檔庫中的文檔和文件夾),都直接或間接繼承了SPSecurableObject這個類。所以這個類提供的一些屬性和方法在SharePoint受權體系中是很是重要的。這個類主要提供了4個屬性和6個方法:
AllRolesForCurrentUser屬性:SPRoleDefinitionBindingCollection類型,獲取當前用戶在該對象上有什麼樣的權限級別,注意該屬性僅供讀取使用,修改沒有任何效果;
EffectiveBasePermissions屬性:SPBasePermission枚舉類型,獲取當前用戶在該對象上有什麼樣的具體權限,注意該屬性是隻讀的,只能查看,不能修改;
HasUniqueRoleAssignments屬性:bool類型,判斷該對象是否擁有獨有的權限分配(仍是繼承了父對象的權限分配);
RoleAssignments屬性:SPRoleAssignmentCollection類型,該對象的權限分配集合。
DoesUserHavePermissions方法:以SPBasePermission做爲參數,在接口提供的方法中,僅可以判斷當前用戶是否擁有某些權限(有相應的權限則返回true,沒有返回false),不過在SPWeb、SPList和SPListItem中,都提供了該方法的重載,加入了一個SPUser參數,用以判斷某個用戶在該對象上是否有某些權限;
CheckPermissions方法:與上述方法相似,一樣以SPBasePermission做爲參數,檢測當前用戶是否擁有某些權限,不一樣之處在於,該方法沒有返回值,若是當前用戶在該對象上沒有所檢測的權限時,程序會拋出一個UnauthorizedAccessException類型的異常;
GetUserEffectivePermissions方法:這是在2010中新增的一個方法,該方法以用戶登錄名(string)爲參數,返回SPBasePermissions枚舉類型,用於檢測某個特定用戶在當前對象上所擁有的具體權限。使用這一方法,能夠方便地檢測用戶在某個對象上所擁有的全部權限。
GetUserEffectivePermissionInfo方法:一樣是在2010中新增的一個方法,該方法的使用與GetUserEffectivePermissions相似,區別在於返回的是SPPermissionInfo對象。這一對象中包含了用戶的具體權限(Permission)以及其權限分配(RoleAssignment),可以更加具體的瞭解到特定用戶在對象上的權限分配狀況。
BreakRoleInheritance方法:結束與父對象的權限分配繼承,方法提供了一個bool型的參數,若是該參數爲true的話,則在結束繼承的同時,保留父對象的權限分配;若是爲false的話,則只保留當前執行操做的用戶的權限分配;在SharePoint 2010中,該方法還提供了另外一種重載,增長一個bool類型的參數clearSubscopes,當指定該參數爲true的時候,可讓當前對象的全部子對象的權限所有從新繼承當前對象,經過使用這一重載,能夠方便地進行權限的從新整理。
ResetRoleInheritance方法:從新繼承父對象上的權限分配,該方法沒有參數。須要特別注意的是,若是對SPWeb使用了該方法,那麼若是網站上有獨有的權限級別的話,權限級別也會從新繼承回父網站的權限級別設置。