假设您在Sharepoint中有两个列表,我们称之为“房子”和“区域”。通过查询字段项的权限继承列表项权限
通过查找字段将每个房屋分配给一个地区。
列表项权限在区域上设置。
现在,我只希望用户只能看到属于他们已阅读区域的房屋。我认为这应该是相对简单的,我看不到这样做的简单方法。我在看什么吗?
假设您在Sharepoint中有两个列表,我们称之为“房子”和“区域”。通过查询字段项的权限继承列表项权限
通过查找字段将每个房屋分配给一个地区。
列表项权限在区域上设置。
现在,我只希望用户只能看到属于他们已阅读区域的房屋。我认为这应该是相对简单的,我看不到这样做的简单方法。我在看什么吗?
如果你想要一个自动化的过程,当添加了新房子出现这种情况,那么就为这个使用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”。
我想我希望有一个更简单的方法:)但现在你已经很清楚地告诉你如何完成这个难题。干杯! – 2010-05-28 06:56:08
@丹恩,权限是这样一个好奇的团队。您可以想象我在SharePoint应用程序上设置基于时间的权限工作流时的“乐趣”。 – 2010-05-28 12:25:13