通过查找字段项的权限继承列表项权限

时间:2010-05-27 14:28:53

标签: sharepoint

假设您在Sharepoint中有两个列表,我们称之为“house”和“region”。

通过查阅字段将每个房屋分配到一个区域。

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

现在我希望用户只能看到属于他们可以阅读的区域的房屋。我认为应该相对简单,我认为没有简单的方法可以做到这一点。我在看什么。

1 个答案:

答案 0 :(得分: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中的所有RoleDefinitionBinding并检查BasePermissions以查看它是否包含“ViewItem”。