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

О том как работают права доступа в SharePoint 2013 и SharePoint 2016.

Защищаемые объекты

Начнем с того, что определим защищаемые объекты в SharePoint, те, на которые можно давать права пользователям. Таких объектов всего три:

  • Сайт (SPWeb)
  • Список (SPList)
  • Элемент списка (SPItem)

Библиотека документов (SPDocumentLibrary) также является защищаемым объектом, но только на основании того, что унаследована от списка.

Заблуждения

Существуют два распространенных заблуждения касаемо прав доступа в SharePoint.

Заблуждение 1: Можно предоставить права на коллекцию сайтов.

Коллекция сайтов в SharePoint не является защищаемым объектом. Коллекция сайтов (SPSite) - это всего лишь контейнер, содержащий в себе один или более сайтов (SPWeb). При этом как минимум один сайт есть всегда (корневой сайт коллекции сайтов).

Заблуждение 2: Можно предоставить права на папку.

Здесь требуется уточнение, что права предоставить можно только на папку ассоциированную со списком или библиотекой, т.е. папка должна быть представлена защищаемым объектом SPListItem. Получить элемент списка связанный с папкой можно через свойство SPFolder.Item. Если же этой связи нет, то будет выдано исключение (а не просто значение null):

Microsoft.SharePoint.SPException: The object specified does not belong to a list
   at Microsoft.SharePoint.SPFolder.InitializeCorrespondingItems(String[] fields)
   at Microsoft.SharePoint.SPFolder.GetItem(String strFileRef, String[] fields)
   at Microsoft.SharePoint.SPFolder.get_Item()

Права

Права в SharePoint представлены перечислением SPBasePermissions и разделены на три группы: права уровня сайта, уровня списка и специальные права.

Права уровня сайта

ПраваЧисловое значениеHex 16
Open655360000000000010000
ViewPages1310720000000000020000
AddAndCustomizePages2621440000000000040000
ApplyThemeAndBorder5242880000000000080000
ApplyStyleSheets10485760000000000100000
ViewUsageData20971520000000000200000
CreateSSCSite41943040000000000400000
ManageSubwebs83886080000000000800000
CreateGroups167772160000000001000000
ManagePermissions335544320000000002000000
BrowseDirectories671088640000000004000000
BrowseUserInfo1342177280000000008000000
AddDelPrivateWebParts2684354560000000010000000
UpdatePersonalWebParts5368709120000000020000000
ManageWeb10737418240000000040000000
AnonymousSearchAccessWebLists21474836480000000080000000
UseClientIntegration687194767360000001000000000
UseRemoteAPIs1374389534720000002000000000
ManageAlerts2748779069440000004000000000
CreateAlerts5497558138880000008000000000
EditMyUserInfo10995116277760000010000000000

Права уровня списка

ПраваЧисловое значениеHex 16
ViewListItems10000000000000001
AddListItems20000000000000002
EditListItems40000000000000004
DeleteListItems80000000000000008
ApproveItems160000000000000010
OpenItems320000000000000020
ViewVersions640000000000000040
DeleteVersions1280000000000000080
CancelCheckout2560000000000000100
ManagePersonalViews5120000000000000200
ManageLists20480000000000000800
ViewFormPages40960000000000001000
AnonymousSearchAccessList81920000000000002000

Специальные права

ПраваЧисловое значениеHex 16
EmptyMask00
EnumeratePermissions46116860184273879044000000000000000
FullMask92233720368547758077FFFFFFFFFFFFFFF

На получение списка прав также нужны права (EnumeratePermissions). Без них вызвать метод, например, SPList.GetUserEffectivePermissions не получится.

Прав много и поэтому они объединены в группы (Permission Levels). Но можно непосредственно назначать права пользователям на объекты в SharePoint.

Как работают права доступа

В SharePoint защищаемые объекты имеют строгую иерархию:

  • Сайт
  • Дочерний сайт
  • Список/Библиотека
  • Элемент/Документ
  • Список/Библиотека
  • Элемент/Документ

Каждый объект (кроме корневого сайта) может как наследовать права от родителя, так и иметь уникальные права доступа. Корневому сайту попросту не от кого наследовать права.

У нас есть пользователи, группы пользователей, защищаемые объекты и возможные права. Для связи этих составляющих в SharePoint используется объект SPRoleAssignment. Связь между этими объектами:

С теорией разобрались. Переходим к практике.

SharePoint 2013

На практике иногда поведение SharePoint не очевидно и зависит от версии SharePoint. Для примера я создал следующую структуру:

Все объекты имеют уникальные права. Изначально тестовый пользователь не имеет никаких прав ни на какие объекты в SharePoint. В примере я начну с выдачи прав пользователю на файл. Затем буду выдавать права на родительские объекты, фиксируя результат и возможности пользователя.

Права только на файл

Если нам необходимо предоставить пользователю права на файл, расположенный в папке библиотеки документов. Что необходимо для этого сделать? Пробуем сначала дать права именно на файл (не наследующий права от папки):

Права, предоставленные пользователю после этой операции:

Корневой сайт: Никаких прав

Дочерний сайт: Open, BrowseUserInfo, UseClientIntegration

Библиотека документов: Open, BrowseUserInfo, UseClientIntegration

Папка: Open, BrowseUserInfo, UseClientIntegration

Документ:ViewListItems, AddListItems, EditListItems, DeleteListItems, OpenItems, ViewVersions, DeleteVersions, ManagePersonalViews, ViewFormPages, Open, ViewPages, CreateSSCSite, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts, UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts, EditMyUserInfo

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

Права на папку

Теперь предоставим пользователю права на папку в библиотеке документов (редактирование). Права на папку после этого будут идентичны правам на файл, но на деле не изменится ничего: пользователь не сможет просматривать содержимое папки, добавлять в неё файлы.

Права на библиотеку

Добавим пользователю права на редактирование всей библиотеки:

После это права на библиотеку: ViewListItems, AddListItems, EditListItems, DeleteListItems, OpenItems, ViewVers ions, DeleteVersions, ManagePersonalViews, ManageLists, ViewFormPages, Open, ViewPages, CreateSSCSite, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts, UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts, EditMyUserInfo

Только теперь пользователь может открыть библиотеку в браузере. Открытие дочернего и корневого сайтов, просмотр его содержимого пользователю недоступно.

В SharePoint 2013 предоставление прав на элементы списка или документы в библиотеки не дают пользователю прав на доступ к самой библиотеке документов. Предоставляя права на объект пользователю, необходимо проверить наличие прав у этого пользователя на родительские объекты.

Права на дочерний сайт

Предоставление прав на дочерний сайт ожидаемо позволит пользователю просматривать его содержимое. Корневой сайт будет по прежнему недоступен.

В SharePoint 2013 предоставление прав на дочерний сайт не дают пользователю прав на доступ к родительскому сайту.

SharePoint 2016

Теперь тот же порядок действий выполним в SharePoint 2016.

Права на файл

Предоставив права на файл в папке библиотеки пользователь получает права на объекты:

Корневой сайт: никаких прав Дочерний сайт: ViewFormPages, Open, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs Библиотека документов: ViewFormPages, Open, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs Папка: ViewFormPages, Open, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs Файл: ViewListItems, AddListItems, EditListItems, DeleteListItems, OpenItems, ViewVersions, DeleteVersions, ManagePersonalViews, ViewFormPages, Open, ViewPages, CreateSSCSite, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts, UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts, EditMyUserInfo

SharePoint 2016 ведет себя несколько иначе и неявно дает больше прав на родительские объекты в сравнении с SharePoint 2013.

В SharePoint 2016 предоставление прав пользователю на файл в папке библиотеке документов неявно позволяет пользователю открывать родительскую библиотеку и папку.

В библиотеке пользователь не видит папку, содержащую файл, на который были предоставлены права:

Но может перейти по ссылке в папку, на которую права явно не были предоставлены (в отличии от SharePoint 2013):

Права на папку

Также как и в SharePoint 2013 предоставление прав на папку особых привилегий не дает. Права на папку ровно такие же как и на файл. Теперь пользователь видит папку в библиотеке:

Права на библиотеку

Права на библиотеку не влияют на возможность просматривать родительский сайт ровно как в SharePoint 2013. Только дополнительные возможности касаемо самой библиотеки:

Права на дочерний сайт

Поведение аналогично SharePoint 2013.

В SharePoint 2016 предоставление прав на дочерний сайт не дают пользователю прав на доступ к родительскому сайту.

Виталий Жуков

Виталий Жуков

Техлид, Архитектор, Разработчик, Microsoft MVP. Более 20 лет опыта в области системной интеграции и разработки программного обеспечения. Специализируюсь на проектировании и внедрении масштабируемых высокопроизводительных программных решений в различных отраслях.

Смотрите также

SharePoint 2013. Включаем анонимный доступ

SharePoint 2013. Включаем анонимный доступ