Рекомендации по разработке прав доступа
<< Click to Display Table of Contents >> Разработка > Элементы разработки > Типы сущностей > Авторизация Рекомендации по разработке прав доступа |
В разделе вы найдете ответы на вопросы:
•какой способ авторизации указать для нового типа сущности
•как выдать права на экземпляр
•как проверить вхождение пользователя в роль, группу
•какие есть рекомендации по выдаче прав на разные объекты в инициализации модуля
Выбор способа авторизации для нового типа сущности
При создании нового типа сущности важно правильно указать способ авторизации:
•для типов документов и задач автоматически выбирается способ авторизации Для типа и экземпляра сущности, менять его запрещено;
•для большинства справочников, в которых не нужно скрывать весь список записей или разделять данные на личные и общие, рекомендуется выбирать способ авторизации Для типа сущности. Он проще для использования, так как права на экземпляры определяются только настройкой администрирования;
•для справочников, в которых необходимо выдавать разным пользователям разные права на записи (например, «Проекты»), рекомендуется выбирать способ авторизации Для типа и экземпляра сущности и назначать права на экземпляры программно.
Возможна автоматическая выдача прав системой или программная выдача прав на экземпляр.
Примеры автоматической выдачи прав на объект сотруднику системой:
•выдача прав на вложенные в задачу документы, чтобы исполнитель задания мог их увидеть;
•выдача прав группе регистрации документа, чтобы другие делопроизводители могли увидеть зарегистрированный в их журнале документ.
Программно права выдаются при помощи метода Grant():
_obj.AccessRights.Grant(recipient, accessRightsType);
Чтобы исключить лишнюю перевыдачу прав, используйте методы:
•IsGranted() – проверяет права пользователя на объект:
// Проверить, выданы ли права на исходную задачу, и при необходимости выдать их.
if (!_obj.MainTask.AccessRights.IsGranted(accessRight.AccessRightsType, accessRight.Recipient))
_obj.MainTask.AccessRights.Grant(accessRight.Recipient, accessRight.AccessRightsType);
•IsGrantedDirectly() – проверяет права пользователя на объект, выданные пользователю лично. Не учитывает, в какие группы и роли он входит:
// Проверить, выданы ли права секретарю, и при необходимости выдать их.
if (_obj.Secretary!= null && !_obj.AccessRights.IsGrantedDirectly(DefaultAccessRightsTypes.Change, _obj.Secretary))
_obj.AccessRights.Grant(_obj.Secretary, DefaultAccessRightsTypes.Change);
•IsGrantedWithoutSubstitution() – проверяет, выданы ли права пользователю, не учитывает права по замещению:
// Проверить, выданы ли исполнителю права на вложение, и при необходимости выдать их.
var accessRights = (IInternalEntityAccessRights)attachment.AccessRights;
if (!accessRights.IsGrantedWithoutSubstitution(Security.BasicOperations.Read, performer))
attachmentsWithoutAccessRight.Add(attachment);
В системе нет информации о том, каким образом были выданы права: программно или вручную пользователем. Не рекомендуется изымать права, если неизвестно, как они были выданы. Исключением являются ситуации, когда права однозначно выдаются или изымаются системой и не меняются вручную:
// Изъять права на изменение у предыдущего ответственного.
if (responsible != null && !Equals(responsible, _obj.ResponsibleEmployee))
_obj.AccessRights.Revoke(responsible, DefaultAccessRightsTypes.Change);
Проверка прав через вхождение в роль
Полный доступ, как правило, включает в себя все операции, кроме удаления. Поэтому замещающий, руководитель или администратор могут получить «чужие» права. При этом на администратора не распространяются даже запрещающие права.
Из-за этого может возникнуть потребность дополнительно проверить, входит ли пользователь в определенную группу. Например, в группу регистрации.
Чтобы проверить вхождение пользователя в группу с учетом иерархии вложенных групп, используйте методы и свойства:
•AllRecipientIds() – возвращает список ИД субъектов прав (в основном, роли и группы), правами которых обладает текущий пользователь. При этом учитываются права по замещению.
// Получить действующие журналы регистрации, на которые есть права у текущего пользователя.
var documentRegisters = DocumentRegisters.GetAll()
.Where(l => l.Status == CoreEntities.DatabookEntry.Status.Active)
.Where(l => l.RegisterType == RegisterType.Numbering || Recipients.AllRecipientIds.Contains(l.RegistrationGroup.Id));
•AllRecipientIdsFor() – возвращает список ИД субъектов прав, правами которых обладает указанный пользователь. При этом учитываются права по замещению;
•DirectSubstitutionRecipientIds – возвращает список ИД пользователей, которых напрямую замещает текущий пользователь;
•DirectSubstitutionRecipientIdsFor – возвращает список ИД пользователей, которых напрямую замещает указанный пользователь;
•OwnRecipientIds – возвращает список ИД субъектов прав, правами которых обладает текущий пользователь без учета прав по замещению.
// Проверить, является ли текущий пользователь участником совещания.
query = query.Where(x => Equals(x.President, currentEmployee) || Equals(x.Secretary, currentEmployee) || x.Members.Any(m => Company.Employees.OwnRecipientIds.Contains(m.Member.Id)));
•OwnRecipientIdsFor – возвращает список ИД субъектов прав с правами непосредственно указанного пользователя. При этом права по замещению не учитываются.
// Получить права подписи, на которые есть права у указанного сотрудника.
var ids = Recipients.OwnRecipientIdsFor(_filter.Recipient).ToList();
query = query.Where(s => ids.Contains(s.Recipient.Id));
Для единичной проверки прав можно использовать проверку через вхождение в роль. Это позволяет обойтись без добавления операции авторизации. При этом нужно помнить о производительности системы, так как при проверке вхождения пользователя в роль отправляется запрос на сервер и в базу данных.
Выдача прав на объекты в инициализации модуля
В инициализации модуля рекомендуется выдавать права на все объекты, с которыми будет работать пользователь. Это позволяет начать работу в системе без дополнительной настройки.
Документы. Рекомендуется в инициализации модуля:
•выдавать права всем пользователям на создание таких документов, с которыми будут работать все сотрудники. Например, на создание заявлений, рабочих и простых документов.
Docflow.SimpleDocuments.AccessRights.Grant(allUsers, DefaultAccessRightsTypes.Create);
Docflow.SimpleDocuments.AccessRights.Save();
•выдавать специально созданным ролям права на создание документов, с которыми будут работать отдельная группа сотрудников. Например, договоры, документы бухгалтерии. Зачастую эти же роли будут использоваться для лицензирования модуля.
Cправочники. Рекомендуется в инициализации модуля:
•не выдавать права автоматически на справочники для настройки системы. Потому что если это сделать, то неопытные пользователи, воспользовавшись таким справочником, могут случайно нарушить какой-либо процесс в системе. Нужные права конкретным сотрудникам настроит администратор системы;
•для всех справочников, кроме справочников для настройки системы и справочников с конфиденциальной информацией, всем сотрудникам выдавать права на просмотр.
Company.Employees.AccessRights.Grant(allUsers, DefaultAccessRightsTypes.Read);
Company.Employees.AccessRights.Save();
•выдавать права на создание только отдельным ролям. Например, ролям «Ответственные за настройку регистрации», «Ответственные за контрагентов». Редко всем пользователям требуется менять справочники.
Задачи. Рекомендуется в инициализации модуля для новых типов задач выдавать права на создание всем пользователям.
Workflow.SimpleTasks.AccessRights.Grant(allUsers, DefaultAccessRightsTypes.Create);
Workflow.SimpleTasks.AccessRights.Save();
Роли. Рекомендуется в инициализации модуля создавать предопределенные роли с назначенными правами на нужные объекты, чтобы администратор мог быстро настроить права конкретным сотрудникам или подразделениям.
// Создать роль «Ответственные за финансовый архив».
Docflow.PublicFunctions.Module.CreateRole(Resources.RoleNameFinancialArchiveResponsible, Resources.DescriptionFinancialArchiveResponsible, FinancialArchive.Constants.Module.FinancialArchiveResponsibleRole);
Отчеты. Рекомендуется в инициализации модуля выдавать права на запуск отчета всем пользователям (исключением являются узкоспециализированные отчеты, права на которые выдаются конкретным ролям). Такой подход позволяет не выдавать каждый раз пользователям права на запуск отчета вручную.
// Права на отчеты модуля "Делопроизводство" выдаются только делопроизводителям.
var clerks = Docflow.PublicFunctions.DocumentRegister.Remote.GetClerks();
Reports.AccessRights.Grant(Reports.GetIncomingDocumentsReport().Info, clerks, DefaultReportAccessRightsTypes.Execute);
Вычисляемые папки. Требуется в инициализации модуля выдавать права на просмотр вычисляемых папок всем пользователям. Потому что у администратора нет возможности их настраивать вручную.
public static void GrantRightOnFolders(IRole allUsers)
{
Logger.Debug("Init: Grant right on shell special folders to all users.");
Sungero.Shell.SpecialFolders.Approval.AccessRights.Grant(allUsers, DefaultAccessRightsTypes.Read);
Sungero.Shell.SpecialFolders.Approval.AccessRights.Save();
}
© Компания Directum, 2024 |