Наследование разрешений элемента списка через разрешения для элемента поля поиска - PullRequest
0 голосов
/ 27 мая 2010

Скажем, у вас есть два списка в Sharepoint, давайте назовем их "дом" и "регион".

Каждый дом назначается региону через поле поиска.

Разрешения элементов списка установлены для регионов.

Теперь я хочу, чтобы пользователи видели только те дома, которыепринадлежат регионам, к которым они имеют доступ для чтения.Я считаю, что это должно быть относительно просто, я не вижу простого способа сделать это.Я что-то осматриваю.

1 Ответ

1 голос
/ 27 мая 2010

Если вам нужен автоматизированный процесс, который происходит при добавлении нового дома, то для этого есть достаточно простой метод, использующий EventReceivers. Если у вас нет опыта работы с EventReceivers, ознакомьтесь с этой статьей . Вам нужно будет создать события ItemAdded и ItemUpdated с почти одинаковым содержимым - одно для того, когда дом впервые был построен, и одно для того, когда регион для дома когда-либо изменяется. Во-первых, дом должен нарушить наследование ролей, если у него еще нет уникальных назначений. Теперь, если регион не изменился в обновлении, нет необходимости продолжать. В противном случае вам необходимо очистить текущий набор разрешений, а затем получить регион в поисковом значении, просмотрев список, а затем идентификатор элемента. Переберите разрешения в регионе для всех, у кого есть хотя бы разрешение на чтение, и добавьте этих пользователей в дом. Когда это будет сделано, обновитесь, и теперь единственные люди, которые увидят этот дом, - это те, кто может читать этот конкретный регион. Ниже приведено общее описание того, как может выглядеть код в приемнике событий.

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», вам нужно будет выполнить итерацию по всем RoleDefinitionBindings в этом RoleAssignment и проверить BasePermissions, чтобы увидеть, содержит ли оно «ViewItem».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...