SharePoint服务器端对象模型 之 访问用户、用户组和权限(Part 3)
2016-02-28 19:52
281 查看
(三)权限设置
本节中提供了一个完整的例子进行权限设置,在该例子中,首先创建了一个新的权限级别,之后在某个列表上给一个用户赋予这个权限级别对应的权限。请留意在程序中权限分配的三个部分是如何体现出来的。程序如下(假设程序中所涉及到的网站、列表和用户均真实存在):
程序中在创建权限级别、创建新的权限分配之前,都判断了当前是否已经是自定义的设置,如果不是的话,需要断开与父网站相应的继承关系。这里需要说明的是,在结束权限级别的继承关系的时候,会自动的结束掉子网站与父网站之间权限分配上的继承关系,相应方法的两个bool类型的参数的作用,与结束权限分配方法的参数的作用类似,详情可以进一步参考SDK。
(四)一个特殊的用户——系统帐户
很多用户在使用SharePoint的时候,可能会觉得很奇怪的一点是:当使用某个帐号(多半是Administrator)登录SharePoint的时候,会发现SharePoint显示当前用户并不是我们刚刚输入的那个帐号,而是一个名叫“系统帐户”(System Account)的奇怪帐号。
实际上,这是因为我们登录的帐号是当前Web应用程序所对应的应用程序池的服务帐户,在SharePoint中,几乎所有对数据库的读取和操作,都是通过这个应用程序池的服务帐户来进行的,这个帐户不仅拥有对SharePoint所有资源的读写权限,也拥有对相应数据库的完全控制权限,是一个权限相当大的帐户。因此,为了防止“不法之徒”得知这个帐户后带来的安全隐患,有必要将这个帐户“隐藏”起来,因此,这个帐户不论用户名是什么,在SharePoint中一律显示为“系统帐户”。
“系统帐户”的确是一个奇怪的帐号,它的登录名固定为“SHAREPOINT\System”,SID固定为“S-1-0-0”,用户ID固定为“1073741823” (即0x3FFFFFFF)。这一切奇怪之处都表明了这个帐号的特殊,也都是为了隐藏背后的真正帐号所做的“障眼法”。
(五)用户身份模拟和权限提升
在大多数情况下,在服务器端的代码都是以当前登录网站的用户的身份执行的(在计时器作业程序、某些事件处理程序和某些工作流代码中,可能不是以当前用户的身份来执行代码的,具体详见相关章节的介绍),然而在一些特殊情况下,我们可能需要切换到特定的用户身份来执行一段程序,或者临时使用较高的权限来执行某些操作。这个时候,SharePoint也提供了在代码中进行身份模拟和权限提升的机制。但需要说明的是,不论是身份模拟还是权限提升,在沙盒解决方案(SandBoxed Solution)中都是不被支持的。
1、用户身份模拟
当我们需要代码模拟另一个用户的身份进行某些操作的时候,我们可以使用SPSite构造函数的一个重载,并将需要模拟用户的UserToken作为参数,以此来得到使用某个特定用户构造的上下文。UserToken可以通过SPUser的UserToken属性获得。一个示例程序如下:
通过用户身份模拟,可以在代码中完全使用某个特定的身份来完成一些操作。此外,用户身份模拟的代码并不要求执行者在网站中有特殊的权限,因此在设计应用的时候,需要特别注意,以免产生恶意访问。
2、权限提升
在一些程序中,我们可能需要完成一些比较特殊的操作,而这些操作可能需要较高的权限才能完成(例如记录日志、对服务器进行磁盘操作、读写数据库等等),但我们又不希望直接赋予普通用户这些权限。此时,我们可以使用权限提升的方式来进行操作。
权限提升是临时将用户权限提升至“系统帐户”的身份来运行,关于“系统帐户”的描述,请参看之前的章节。
权限提升使用SPSecurity的RunWithElevatedPrivileges静态方法实现,参数是需要执行的代码的函数。在权限提升的时候,需要特别注意的是:必须再次创建SPSite和SPWeb对象,使用新创建的网站对象,才能获得权限提升之后的上下文。下面是一个示例:
同样的,用户身份模拟的代码并不要求执行者在网站中有特殊的权限,而且因为这是一个相对来说比较危险的操作,在设计应用的时候,一定要加以注意,以免产生恶意的操作,造成安全隐患。
本节中提供了一个完整的例子进行权限设置,在该例子中,首先创建了一个新的权限级别,之后在某个列表上给一个用户赋予这个权限级别对应的权限。请留意在程序中权限分配的三个部分是如何体现出来的。程序如下(假设程序中所涉及到的网站、列表和用户均真实存在):
using(SPSite site = new SPSite("http://sp2010/book"))
{
using(SPWeb web = site.OpenWeb())
{
SPRoleDefinition newRole = new SPRoleDefinition();
newRole.Name = "NewRole";
newRole.Description = "Role to view list items and pages.";
newRole.BasePermissions =
SPBasePermissions.ViewListItems | SPBasePermissions.ViewPages;
if (!web.HasUniqueRoleDefinitions)
{
web.RoleDefinitions.BreakInheritance(true, true);
}
web.RoleDefinitions.Add(newRole);
SPList list = web.Lists["Chapters"];
if (!list.HasUniqueRoleAssignments)
list.BreakRoleInheritance(true);
SPRoleAssignment assignment = new SPRoleAssignment(
web.EnsureUser("CONTOSO\\kaneboy"));
assignment.RoleDefinitionBindings.Add(
web.RoleDefinitions["NewRole"]);
list.RoleAssignments.Add(assignment);
}
}
程序中在创建权限级别、创建新的权限分配之前,都判断了当前是否已经是自定义的设置,如果不是的话,需要断开与父网站相应的继承关系。这里需要说明的是,在结束权限级别的继承关系的时候,会自动的结束掉子网站与父网站之间权限分配上的继承关系,相应方法的两个bool类型的参数的作用,与结束权限分配方法的参数的作用类似,详情可以进一步参考SDK。
(四)一个特殊的用户——系统帐户
很多用户在使用SharePoint的时候,可能会觉得很奇怪的一点是:当使用某个帐号(多半是Administrator)登录SharePoint的时候,会发现SharePoint显示当前用户并不是我们刚刚输入的那个帐号,而是一个名叫“系统帐户”(System Account)的奇怪帐号。
实际上,这是因为我们登录的帐号是当前Web应用程序所对应的应用程序池的服务帐户,在SharePoint中,几乎所有对数据库的读取和操作,都是通过这个应用程序池的服务帐户来进行的,这个帐户不仅拥有对SharePoint所有资源的读写权限,也拥有对相应数据库的完全控制权限,是一个权限相当大的帐户。因此,为了防止“不法之徒”得知这个帐户后带来的安全隐患,有必要将这个帐户“隐藏”起来,因此,这个帐户不论用户名是什么,在SharePoint中一律显示为“系统帐户”。
“系统帐户”的确是一个奇怪的帐号,它的登录名固定为“SHAREPOINT\System”,SID固定为“S-1-0-0”,用户ID固定为“1073741823” (即0x3FFFFFFF)。这一切奇怪之处都表明了这个帐号的特殊,也都是为了隐藏背后的真正帐号所做的“障眼法”。
(五)用户身份模拟和权限提升
在大多数情况下,在服务器端的代码都是以当前登录网站的用户的身份执行的(在计时器作业程序、某些事件处理程序和某些工作流代码中,可能不是以当前用户的身份来执行代码的,具体详见相关章节的介绍),然而在一些特殊情况下,我们可能需要切换到特定的用户身份来执行一段程序,或者临时使用较高的权限来执行某些操作。这个时候,SharePoint也提供了在代码中进行身份模拟和权限提升的机制。但需要说明的是,不论是身份模拟还是权限提升,在沙盒解决方案(SandBoxed Solution)中都是不被支持的。
1、用户身份模拟
当我们需要代码模拟另一个用户的身份进行某些操作的时候,我们可以使用SPSite构造函数的一个重载,并将需要模拟用户的UserToken作为参数,以此来得到使用某个特定用户构造的上下文。UserToken可以通过SPUser的UserToken属性获得。一个示例程序如下:
using(SPSite origSite = new SPSite("http://sp2010/book"))
{
using(SPWeb origWeb = origSite.OpenWeb())
{
// 运行该程序的用户:
Console.WriteLine(origWeb.CurrentUser.LoginName);
SPUser user = origWeb.AllUsers["CONTOSO\\Erucy"];
using(SPSite erucySite = new SPSite("http://sp2010/book",
user.UserToken))
{
using(SPWeb erucyWeb = erucySite.OpenWeb())
{
// 特定的用户:
Console.WriteLine(erucyWeb.CurrentUser.LoginName);
}
}
}
}
通过用户身份模拟,可以在代码中完全使用某个特定的身份来完成一些操作。此外,用户身份模拟的代码并不要求执行者在网站中有特殊的权限,因此在设计应用的时候,需要特别注意,以免产生恶意访问。
2、权限提升
在一些程序中,我们可能需要完成一些比较特殊的操作,而这些操作可能需要较高的权限才能完成(例如记录日志、对服务器进行磁盘操作、读写数据库等等),但我们又不希望直接赋予普通用户这些权限。此时,我们可以使用权限提升的方式来进行操作。
权限提升是临时将用户权限提升至“系统帐户”的身份来运行,关于“系统帐户”的描述,请参看之前的章节。
权限提升使用SPSecurity的RunWithElevatedPrivileges静态方法实现,参数是需要执行的代码的函数。在权限提升的时候,需要特别注意的是:必须再次创建SPSite和SPWeb对象,使用新创建的网站对象,才能获得权限提升之后的上下文。下面是一个示例:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using(SPSite newSite = new SPSite("http://sp2010/book"))
{
using(SPWeb newWeb = newSite.OpenWeb())
{
Console.WriteLine(newWeb.CurrentUser.LoginName);
// 执行相应的需要权限的代码
// ……
}
}
});
同样的,用户身份模拟的代码并不要求执行者在网站中有特殊的权限,而且因为这是一个相对来说比较危险的操作,在设计应用的时候,一定要加以注意,以免产生恶意的操作,造成安全隐患。
相关文章推荐
- ssh整和hibernate时出现错误(一)
- ssh整和hibernate时出现错误(二)
- AndroidStudio-------IdeaVim插件
- app登陆以及与后台通讯安全性
- Java中文件File类的基本方法使用演示
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position 7: ordinal not in range(128)
- OA学习笔记-006-SPRING2.5与hibernate3.5整合
- memset in C++ and C
- iphone6 字体模糊解决办法
- 计算机网络20--Socket编程
- UITextField 限制输入字数
- 传输层中的协议 TCP & UDP
- 正则表达式中 ? 符号的一些用法
- stanford-NLP-CLASS1课堂笔记
- 大数据应用与医学检验平台结合(论文)
- How browsers work<一>介绍
- UIView
- Loadrunner重要概念——集合点
- JavaScript高级程序设计学习笔记第十五章--使用Canvas绘图
- 集合中的接口使用方法