SharePoint и права доступа

И снова здравствуйте, вот решил написать второй пост. При создании очередного проекта возникла потребность, ограничить доступ к элементам списка (задач), и чтобы доступ на редактирование имели только два пользователя — создатель и тот, на кого эта задача назначена, и при этом тот, на кого она назначена, не мог эту задачу удалить.

Порывшись в интернете, я обнаружил, что многие программисты вешали проверку прав пользователя на событие, и если пользователь был не тот, то просто кидали стандартное исключение SharePoint о недостатке прав на данную операцию. Но мне это решение не понравилось. Покопавшись, я сделал так, что пользователь, у которого нет прав, не видит операций, которые ему запрещены.

Суть решения состоит в том, что при событиях ItemAdded и ItemUpdated я для данной конкретной записи наделяю правами нужных мне пользователей, а остальным пользователям присваиваю роль с правами только для чтения. А поскольку мне нужны специфические права (запрет удаления), мне пришлось создать отдельную роль с ограниченными правами.

Итак, теперь поподробней.

реферальный код Bybit
private void CreateAccess(SPItemEventProperties properties)
        { 
DisableEventFiring();  //данный метод присутствует в событии ItemUpdated  поэтом отключаем Updated чтоб не получить в дальнейшем зацикливание
// запись создается/редактируется под пользователем, поднимаем приоритет операций до прав админа (поскольку только он может создавать и назначать роли)            
SPSecurity.RunWithElevatedPrivileges(delegate()  
   {
       if (properties.ListItemId != 0) 
       {
           SPWeb web = new SPSite(properties.WebUrl).OpenWeb();  //получаем узел 
           SPListItem item = web.Lists[properties.ListTitle].Items.GetItemById(properties.ListItemId);  // получаем созданную запись
          //отключаем наследование прав пользователей списка           
           if (!item.HasUniqueRoleAssignments) { item.BreakRoleInheritance(false); };

           #region для всех пользователей и групп  узла назначаем права ридеров
           for (int i = 0; i < web.Users.Count; i++)
           {
               var roleAssignment = new SPRoleAssignment(
               web.Users[i].LoginName, 
               web.Users[i].Email,
               web.Users[i].Name, 
               web.Users[i].Notes);  //добавляем пользователя в объект роли
               roleAssignment.RoleDefinitionBindings.Add(web.RoleDefinitions.GetByType(SPRoleType.Reader));
               //назначаем роль ридера          
               item.RoleAssignments.Add(roleAssignment);  добавляем пользователя в «хранилище ролей» записи
           }
           for (int i = 0; i < web.Groups.Count; i++) // проделываем тоже самое с группами
           {
               var roleAssignment = new SPRoleAssignment(web.Groups[i]);

               roleAssignment.RoleDefinitionBindings.Add(web.Groups[i].Name == "Группа админов"
                               ? web.RoleDefinitions.GetByType(
                                   SPRoleType.Administrator)
                               : web.RoleDefinitions.GetByType(SPRoleType.Reader));
               item.RoleAssignments.Add(roleAssignment); 
           }
           #endregion

 

Рекомендую статью:  Клонирование операционных систем средствами Windows Deployment Services

Здесь хочется отметить, что если для данной записи не добавить (или удалить) пользователя из «хранилища ролей» записи, то этот пользователь не увидит данной записи в списке. Что очень удобно, особенно в списке документов, когда нужно спрятать какой-то документ, например контракт.

#region назначаем права для автора и того на кого назначено задание
SPUser author = new SPFieldUserValue(
                web, 
                properties.ListItem["Author"].ToString()).User;
//получаем пользователя из поля автор и назначаем ему роль участник
SPRoleAssignment authorRoleAssignment = new SPRoleAssignment(
                   author.LoginName, 
                   author.Email, 
                   author.Name, 
                   author.Notes);
authorRoleAssignment.RoleDefinitionBindings.Add(web.RoleDefinitions.GetByType(SPRoleType.Contributor));
item.RoleAssignments.Add(authorRoleAssignment);

AddAccess(web);  // метод создания роли участника но без возможности удаления записи, данный метод описан ниже
                    //Далее созданную роль (Ограниченное участие)// присваиваем пользователю, на которого назначено задание
SPUser assignedTo = new SPFieldUserValue(
                    web, 
                    properties.ListItem["AssignedTo"].ToString()).User;
SPRoleAssignment assignedToRoleAssignment = new SPRoleAssignment(
              assignedTo.LoginName, 
              assignedTo.Email, 
              assignedTo.Name, 
              assignedTo.Notes);
assignedToRoleAssignment.RoleDefinitionBindings.Add(web.RoleDefinitions["Ограниченное участие"]);

item.RoleAssignments.Add(assignedToRoleAssignment);                  
item.SystemUpdate(false);  //поскольку права можно назначить уже созданной записи то чтобы наши манипуляции с правами не попали в журнал версий записи вызываем данный метод
#endregion
}

Итак, самое интересное: создаем роль, при которой пользователь не будет видеть ни в карточке записи, ни в меню записи в представлении списка команды «удалить запись».

private void AddAccess(SPWeb web)
        {
//проверяем, не была ли роль создана ранее
            bool roleIs = false;
            foreach (SPRoleDefinition roleDefinition in web.RoleDefinitions)
            {
                if (roleDefinition.Name == "Ограниченное участие") { roleIs = true; }
            }


            if (!roleIs) //ну и если не было создано роли ранее то собственно создаем саму роль
            {
                SPRoleDefinition roleDefinition = new SPRoleDefinition()
                {
                    BasePermissions = SPBasePermissions.OpenItems |
                    SPBasePermissions.ViewListItems |
                    SPBasePermissions.AddListItems |
                    SPBasePermissions.EditListItems |
                    SPBasePermissions.OpenItems |
                    SPBasePermissions.ViewVersions |
                    SPBasePermissions.DeleteVersions |
                    SPBasePermissions.ManagePersonalViews |
                    SPBasePermissions.ViewFormPages |
                    SPBasePermissions.Open |
                    SPBasePermissions.ViewPages |
                    SPBasePermissions.CreateSSCSite |
                    SPBasePermissions.BrowseDirectories |
                    SPBasePermissions.BrowseUserInfo |
                    SPBasePermissions.AddDelPrivateWebParts |
                    SPBasePermissions.UpdatePersonalWebParts |
                    SPBasePermissions.UseClientIntegration |
                    SPBasePermissions.UseRemoteAPIs |
                    SPBasePermissions.CreateAlerts |
                    SPBasePermissions.EditMyUserInfo,
                    Name = "Ограниченное участие",
                    Description = "Все привилегии роли Участник кроме возможности удаления"
                };

                web.RoleDefinitions.BreakInheritance(true, true);
                web.RoleDefinitions.Add(roleDefinition);
                web.Update();
            }
        }

 

Я уже 3 года торгую фьючерсами на Bybit и приглашаю тебя присоединиться и получить до $30 000 бонусами плюс скидки на комиссии:
Рекомендую статью:  Мой стиль подключения WPF стилей.

Зарегистрироваться на Bybit

Чем больше депозит – тем больше бонусов. Также моим рефералам доступны торговые боты для трейдинга по самым выгодным тарифам.

Рейтинг
( Пока оценок нет )
Загрузка ...
Кводо.ру