Sharepoint 通过对查阅字段项的权限继承列表项权限

Sharepoint 通过对查阅字段项的权限继承列表项权限,sharepoint,Sharepoint,假设您在Sharepoint中有两个列表,让我们称它们为“房屋”和“区域” 每个房屋通过查找字段指定给一个区域 已在区域上设置列表项权限 现在,我希望用户只看到属于他们已阅读访问的区域的房屋。我认为这应该是相对简单的,我认为没有简单的方法可以做到这一点。我是不是看得太多了。如果你想要一个自动的过程,在新房子被添加时发生,那么有一个足够简单的方法使用EventReceivers。如果您没有使用EventReceivers的经验,请查看基础知识。您将需要创建内容几乎完全相同的ItemAdded和It

假设您在Sharepoint中有两个列表,让我们称它们为“房屋”和“区域”

每个房屋通过查找字段指定给一个区域

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


现在,我希望用户只看到属于他们已阅读访问的区域的房屋。我认为这应该是相对简单的,我认为没有简单的方法可以做到这一点。我是不是看得太多了。

如果你想要一个自动的过程,在新房子被添加时发生,那么有一个足够简单的方法使用EventReceivers。如果您没有使用EventReceivers的经验,请查看基础知识。您将需要创建内容几乎完全相同的ItemAdded和ItemUpdate事件——一个用于房屋首次建造时,另一个用于房屋所在区域发生变化时。首先,如果房子还没有唯一的分配,它必须打破角色继承。现在,如果区域在更新中没有更改,则无需继续。否则,您需要清除当前权限集,然后通过查找列表和项目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
的点,此代码段所做的全部工作就是检查是否为该区域的该用户分配了“READ”角色定义。如果您想特别检查“ViewItem”权限,您必须遍历该RoleAssignment中的所有RoleDefinitionBindings,并检查BasePermissions是否包含“ViewItem”。

我想我希望有一种更简单的方法:)但现在您已经大致了解了困难的解决方法。干杯@丹:是的,权限是一堆不可靠的东西。您可以想象我在SharePoint应用程序上设置基于时间的权限工作流的“乐趣”。