2010-05-27 61 views
0

假设您在Sharepoint中有两个列表,我们称之为“房子”和“区域”。通过查询字段项的权限继承列表项权限

通过查找字段将每个房屋分配给一个地区。

列表项权限在区域上设置。

现在,我只希望用户只能看到属于他们已阅读区域的房屋。我认为这应该是相对简单的,我看不到这样做的简单方法。我在看什么吗?

回答

1

如果你想要一个自动化的过程,当添加了新房子出现这种情况,那么就为这个使用EventReceivers一个再简单不过的方法。如果您没有EventReceivers的经验,请参阅this article了解基础知识。您需要创建具有完全相同内容的ItemAdded和ItemUpdated事件 - 一个用于房屋首次制作时,另一个用于房屋区域改变的情况。首先,如果房子还没有独特的分配,房屋必须打破角色继承。现在,如果该区域在更新中未更改,则无需继续。否则,你需要清除当前权限集,然后通过查找列表,然后将物品ID检索查找值的区域。跨越权限在迭代的人谁至少读取权限的区域,以及这些用户添加到房子。完成后,更新,现在唯一能看到那个房子的人是那些可以阅读那个特定区域的人。以下是代码在您的事件接收器中可能看起来像什么的一般要点。

using (SPSite site = new SPSite(properties.WebUrl)) 
{ 
    using (SPWeb web = site.OpenWeb()) 
    { 
     SPListItem houseItem = properties.ListItem; 
     SPList regionList = web.Lists["Region"]; 
     if (houseItem.HasUniqueRoleAssignments) 
     { 
      houseItem.BreakRoleInheritance(false); //Clears all 
     } 

     //After confirming that the region has changed and is not empty/null... 
     SPFieldLookupValue regionLookup = houseItem["RegionLookup"] as SPFieldLookupValue; 
     SPListItem regionItem = regionList.GetItemById(regionLookup.LookupId); 
     SPRoleDefinition readAccess = web.RoleDefinitions["Read"]; 
     foreach (SPRoleAssignment userRole in regionItem.RoleAssignments) 
     { 
      //READ CHECK 
      if (userRole.RoleDefinitionBindings.Contains(readAccess)) 
      { 
       houseItem.RoleAssignments.Add(userRole); 
      } 
     } 
     this.DisableEventFiring(); 
     houseItem.SystemUpdate(false); 
     this.EnableEventFiring(); 
    } 
} 

注意,对于点标记//READ CHECK,所有这些代码片段并进行检查,如果“读”的角色定义分配给该用户的区域。如果您想专门检查“ViewItem”权限,则必须遍历该RoleAssignment中的所有RoleDefinitionBindings,然后检查BasePermissions以查看其是否包含“ViewItem”。

+0

我想我希望有一个更简单的方法:)但现在你已经很清楚地告诉你如何完成这个难题。干杯! – 2010-05-28 06:56:08

+0

@丹恩,权限是这样一个好奇的团队。您可以想象我在SharePoint应用程序上设置基于时间的权限工作流时的“乐趣”。 – 2010-05-28 12:25:13