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: });
一样的,用户身份模拟的代码并不要求执行者在网站中有特殊的权限,并且由于这是一个相对来讲比较危险的操做,在设计应用的时候,必定要加以注意,以避免产生恶意的操做,形成安全隐患。
相关文章
相关标签/搜索