none
Массовое удаление принципалов (SPPrincipal) в SPRoleAssignmentCollection RRS feed

  • Вопрос

  • Всем привет.

    В рамках рабочего процесса (Workflow) реализован механизм автоматического разграничения прав доступа на элемент списка. Первым шагом удаляются все принципалы (SPPrincipal) по определенной логике, которые в свою очередь вычисляются в LINQ запросе. И как раз сам процесс удаления является узким местом.

    Пример кода:

    var principalsIdsWithoutFullMaskPermissions = from roleAssignment in listItem.RoleAssignments.OfType<SPRoleAssignment>()
                                                  where Principals.GetPermissions(roleAssignment) != SPBasePermissions.FullMask //Примерное условное, не берите во внимание :)
                                                  select roleAssignment.Member.ID;
    
    if (principalsIdsWithoutFullMaskPermissions.Any())
    {
       List<int> principalsIdsWithoutFullMaskPermissions2 = new List<int>(principalsIdsWithoutFullMaskPermissions);
       foreach (int memberId in principalsIdsWithoutFullMaskPermissions2)
       {
            listItem.RoleAssignments.RemoveById(memberId);
       }
    }

    Иногда бывают такие ситуации, когда список для удаления составляет большое кол-во (500 и более) принципалов и цикл выполняется достаточно долго. 

    P.S. Как альтернативу вижу дополнительную проверку по сравнению кого больше, тех кого удалять или тех кого оставлять. Затем выбирать по колву наименьшее.

    Есть ли какие-нить альтернативные методы по быстрому удалению принципалов не используя циклы?

    P.P.S. Есть какие-нить методы по борьбе с распространением огромного кол-ва принципалов с уровнем разрешения "Ограниченный доступ", которые автоматически появляются при персональном назначении прав доступа на элемент списка?


    21 августа 2012 г. 16:26

Ответы

  • 1) Есть ли какие-нить альтернативные методы по быстрому удалению принципалов не используя циклы?
    2) Есть какие-нить методы по борьбе с распространением огромного кол-ва принципалов с уровнем разрешения "Ограниченный доступ", которые автоматически появляются при персональном назначении прав доступа на элемент списка?


    Доброе время суток, Кирилл

    Если кратко то:

    1) нет (кроме простейших кейсов когда нудно просто удалить все Assignment'ы)

    2) нет - так работает SharePoint

    Если у вас какая-то логика раздачи прав зависит от значения какого-либо поля (например всегда если выбрана в некотором поле Компания-Х, добавлять пользователей Ах, Бх и Вх), то вы можете попробовать написать ClaimsProvider и предоставлять доступ не конкретным пользователям а "псевдогруппе" Компания-Х, а в момент авторизации "клеймить токен пользователя" :) , если он относится к какой-либо компании  (Пример ниже в подписи.)


    LinkedIn Profile
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    • Изменено HeToC 21 августа 2012 г. 18:55
    • Помечено в качестве ответа Kirill Vinokurov 22 августа 2012 г. 15:18
    21 августа 2012 г. 18:52

Все ответы

  • 1) Есть ли какие-нить альтернативные методы по быстрому удалению принципалов не используя циклы?
    2) Есть какие-нить методы по борьбе с распространением огромного кол-ва принципалов с уровнем разрешения "Ограниченный доступ", которые автоматически появляются при персональном назначении прав доступа на элемент списка?


    Доброе время суток, Кирилл

    Если кратко то:

    1) нет (кроме простейших кейсов когда нудно просто удалить все Assignment'ы)

    2) нет - так работает SharePoint

    Если у вас какая-то логика раздачи прав зависит от значения какого-либо поля (например всегда если выбрана в некотором поле Компания-Х, добавлять пользователей Ах, Бх и Вх), то вы можете попробовать написать ClaimsProvider и предоставлять доступ не конкретным пользователям а "псевдогруппе" Компания-Х, а в момент авторизации "клеймить токен пользователя" :) , если он относится к какой-либо компании  (Пример ниже в подписи.)


    LinkedIn Profile
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    • Изменено HeToC 21 августа 2012 г. 18:55
    • Помечено в качестве ответа Kirill Vinokurov 22 августа 2012 г. 15:18
    21 августа 2012 г. 18:52
  • Эх! Спасибо за ответ.

    Реализовал сл. образом:

    С помощью LINQ запроса получаю две коллекции с обратными условиями выборки. Затем сравниваю по кол-ву полученных элементов, и выполняю тот или иной способ предварительной очистки прав доступа в зависимости от того, где меньше.


    22 августа 2012 г. 15:17