假设您在Sharepoint中有两个列表,我们称之为“house”和“region”。
通过查阅字段将每个房屋分配到一个区域。
列表项权限是在区域上设置的。
现在我希望用户只能看到属于他们可以阅读的区域的房屋。我认为应该相对简单,我认为没有简单的方法可以做到这一点。我在看什么。
答案 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”。