(二)权限相关对象
1、用户(SPUser)
SharePoint中使用SPUser表示用户(和域组),使用SPUserCollection表示用户集合。
获取一个用户大致有如下几种方式:
(1) 使用SPWeb的CurrentUser属性获取当前用户,即当前上下文中的用户;
(2) 使用SPWeb的EnsureUser(string loginName)方法,该方法会根据参数中的登陆名判断网站中是否有该用户存在,如果有的话直接返回;如果没有的话,会将用户添加到网站中(但是不分配任何权限),然后再返回这一用户。不过该方法在运行的时候需要有网站集管理员的权限。
(3) 使用SPWeb的Users属性(SPUserCollection)获取网站中的用户集合,这个属性获取到的是直接在该网站中分配了权限,以及通过SharePoint用户组分配了该网站权限的那些用户;
(4) 使用SPWeb的AllUsers属性(SPUserCollection)获取网站中的用户集合,这个属性除了获取到Users属性中的用户之外,还包含了那些通过AD域组加入到该网站中的那些用户(不过前提条件是这个用户曾经访问过这个网站);
(5) 使用SPWeb的SiteUsers属性(SPUserCollection)获取网站集中的用户集合,这个属性除了能够获取到上述用户之外,还包含了那些没有在当前网站中分配过权限,但是在网站集的其他网站中被分配了权限的用户;
(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;只有当以管理员的身份执行程序的时候,才能正确判断出哪些用户是网站集管理员,哪些用户不是。
2、用户组(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 | 用户组中包含的用户 |
3、权限(SPBasePermission)
权限是指具体的用户行为,比如添加列表条目、删除列表条目、管理列表、查看页面等等。在SharePoint中使用SPBasePermission枚举来表示这些权限。
该枚举使用2进制位的方式表示每一种单独的权限,在表示多个权限组合的时候,可以将其进行按位或操作,例如需要表示“添加列表条目和查看列表条目”的权限,则可以使用“SPBasePermission.AddListItems | SPBasePermission.ViewListItems”的方式。
在该枚举中,包含两个特殊的值,即EmptyMask和FullMask分别表示空权限和所有权限,便于用户使用。此外,权限本身是无法被扩展的。
4、权限级别(SPRoleDefinition)
权限级别主要用于描述一组权限的集合,可以将一系列权限定义为一个类似“角色”的对象,例如“读取”权限级别中就包含了查看项目、打开项目、查看版本、查看页面、查看应用等一组权限。在SharePoint中,使用SPRoleDefinition定义权限级别,使用SPRoleDefinitionCollection定义权限级别的集合。
由于权限级别是定义在网站级别,因此在获取权限级别对象的时候,是使用SPWeb的RoleDefinitions属性获取权限级别的集合,之后使用defs[name]的string型索引器,根据权限级别的名称获取某个特定的权限级别。
SPRoleDefinition的一些常用属性如下:
名称 | 类型 | 说明 |
BasePermissions | SPBasePermission | 权限级别包含的具体权限 |
Id | int | 权限级别的ID |
Name | string | 权限级别的名称 |
5、权限分配(SPRoleAssignment)
权限分配是SharePoint权限体系中的核心对象,所有和授权相关的操作大部分都是通过权限分配对象来完成的。在SharePoint中,使用SPRoleAssignment表示权限分配,使用SPRoleAssignmentCollection表示权限分配的集合。
获取权限分配的方式主要是先从分配权限的对象上获取权限分配的集合,通过使用SPWeb、SPList或SPListItem的RoleAssignments属性,得到权限分配的集合,之后一般通过集合的GetAssignmentByPrinciple(SPPrinciple principle)方法,根据用户或用户组得到分配在该对象上的某个特定用户或用户组的权限。这个方法参数的SPPrinciple类型,是SPUser和SPGroup的共有的父类。
正如上一篇的图中所展示的,权限分配包括三大部分,这三部分在SPRoleAssignment的属性中就有所体现:
权限分配的对象:ParentSecurableObject属性(SPSecurableObject类型);
权限分配的用户:Member属性(SPPrinciples类型);
分配的权限级别:RoleDefinitionBindings属性(SPRoleDefinitionBindingCollection类型,用法和SPRoleDefinitionCollection类似)。
而这三个属性,也正是SPRoleAssignment的全部属性。
6、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使用了该方法,那么如果网站上有独有的权限级别的话,权限级别也会重新继承回父网站的权限级别设置。