Проверка и запрос прав
Проверка и запрос прав
Действия, которые выполняются с помощью плагина, могут требовать проверки или запроса прав.
Для проверки прав пользователя есть методы CheckPermission
и CheckPermissions
.
Для запроса прав можно показать диалоговые окна с помощью методов ShowCheckPermissionPopup
и ShowCheckPermissionsPopup
.
Текущего пользователя можно узнать с помощью метода GetCurrentUser
.
Если терминал работает в режиме “Строгое соответствие расписанию”, то текущую роль можно узнать с помощью GetStrictAccordanceToScheduleUserRole
.
Как это выглядит в iikoFront?
Например, плагин добавляет кнопку «SamplePlugin: Show OK popup» на «экран кассы».
Пример реализации можно посмотреть в проекте SDK SamplePlugin в классе ButtonsTester
.
Пусть кнопка будет доступна для нажатия только пользователям с определёнными правами. Это можно сделать несколькими способами. Для начала зарегистрируем кнопку:
// Регистрация действия на экране кассы
subscription = PluginContext.Operations.AddButtonToPaymentScreen("SamplePlugin: Show ok popup", false, true, ShowOkPopupOnPaymentScreen);
В результате выполнения метода регистрации можно получить идентификатор кнопки - subscription.buttonId
.
В дальнейшем будет использоваться этот идентификатор.
Вариант 1: Отключение кнопки для всех пользователей, у кого нет права на её нажатие.
Можно включать и выключать ранее добавленную кнопку на экран кассы с помощью метода UpdatePaymentScreenButtonState
, передавая параметр isEnabled.
Здесь удобнее всего будет воспользоваться событием CurrentUserChanged
, чтобы узнать, какой пользователь сейчас работает.
Подпишемся на событие и проверим, обладает ли пользователь нужным правом (например, право печати Х-отчёта “F_XR”):
// Подписка на событие изменения текущего пользователя
PluginContext.Notifications.CurrentUserChanged.Where(user => user != null).DistinctUntilChanged().Subscribe(user =>
{
var isButtonEnabled = PluginContext.Operations.CheckPermission(user, "F_XR");
PluginContext.Operations.UpdatePaymentScreenButtonState(subscription.buttonId, isEnabled: isButtonEnabled);
});
Таким образом, при изменении текущего пользователя, в зависимости от наличия права “F_XR”, кнопка будет выключаться или включаться.
Метод CheckPermission
принимает на вход 3 аргумента:
IUser
user
— пользователь, для которого проверяется право.string permissionCode
— право, которое должно быть у пользователя.IRole
role
— необязательный параметр. Роль пользователя. Используется, если терминал работает в режиме “Строгое соответствие расписанию”, можно получить с помощью методаGetStrictAccordanceToScheduleUserRole
.
Точно так же можно проверить несколько прав, воспользовавшись методом CheckPermissions
. Он принимает на вход 4 аргумента:
IUser
user
— пользователь, для которого проверяются права.string[] permissionCodes
— права, которые проверяются у пользователя.PermissionsCheckMode
checkMode
— проверять наличие всех прав (PermissionsCheckMode.All
), или хотя бы одного (PermissionsCheckMode.Any
).IRole
role
— необязательный параметр. Роль пользователя. Используется, если терминал работает в режиме “Строгое соответствие расписанию”.
Список прав, которыми обладает пользователь, может поменяться.
Для отслеживания этого, можно подписаться на событие UserChanged
.
Вариант 2: Скрытие кнопки для всех пользователей, у кого нет права на её нажатие.
Можно перенести регистрацию кнопки в подписку CurrentUserChanged
:
(Guid buttonId, IDisposable buttonRegistration)? subscription = null;
// Подписка на событие изменения текущего пользователя
PluginContext.Notifications.CurrentUserChanged.Where(user => user != null).DistinctUntilChanged().Subscribe(user =>
{
if (PluginContext.Operations.CheckPermission(user, "F_XR")) //Пользователь обладает правом
{
if (subscription == null) //Была ли ранее создана кнопка
subscription = PluginContext.Operations.AddButtonToPaymentScreen("SamplePlugin: Show ok popup", false, true, ShowOkPopupOnPaymentScreen);
}
else //Пользователь не обладает правом
{
subscription?.buttonRegistration.Dispose(); //Удаляем кнопку, если она была создана
subscription = null;
}
});
В этом случае, если у пользователя нет права, то кнопка не покажется.
Вариант 3: Проверка возможности выполнения операции в момент нажатия на кнопку.
Если есть возможность воспользоваться экземпляром IViewManager
, то можно показать окно запроса прав.
Например, доступ к нему есть в подписке на событие нажатия на кнопку.
Здесь может быть несколько вариантов реализации.
Вариант 3.1: Если право у пользователя есть, то окно запроса права не покажется. Если у пользователя его нет, то показываем окно запроса права.
private void ShowOkPopupOnPaymentScreen((IOrder order, IOperationService os, IViewManager vm, (Guid buttonId, string caption, bool isChecked, string iconGeometry) state) info)
{
if (info.vm.ShowCheckPermissionPopup("F_XR", false) == null) //Право не было подтверждено
return;
info.vm.ShowOkPopup("Тестовое окно", "Сообщение показано с помощью SamplePlugin.");
}
Метод ShowCheckPermissionPopup
принимает на вход 2 аргумента:
string permissionCode
— право, которое должно быть у текущего пользователя.bool showConfirmPopupAnyway
— если false, то окно покажется только в случае отсутствия права у текущего пользователя. Если true, то окно покажется, даже если пользователь обладает нужным правом.
Метод возвращает экземпляр IUser
— пользователь, который подтвердил право, либо null, если право не было подтверждено.
Следует учитывать, что подтвердить право может любой пользователь, а не только тот, кто в данный момент выполнил вход в терминал.
В нашем случае, если текущий пользователь обладает правом, то окно запроса прав не покажется, произойдёт выполнение операции. Если же права у него нет, то покажется окно запроса прав:
Если право было подтверждено, то метод ShowCheckPermissionPopup
вернёт экземпляр IUser
- пользователя, который подтвердил права.
Вариант 3.2: Запрашивать право в любом случае, даже если у пользователя оно есть.
Иногда непреднамеренное выполнение операции может привести к нежелательным последствиям.
Для этого можно требовать подтверждения права, даже если текущий пользователь им уже обладает.
Переделаем подписку нажатия на кнопку, передав в showConfirmPopupAnyway
true
:
private void ShowOkPopupOnPaymentScreen((IOrder order, IOperationService os, IViewManager vm, (Guid buttonId, string caption, bool isChecked, string iconGeometry) state) info)
{
if (info.vm.ShowCheckPermissionPopup("F_XR", true) == null) //Право не было подтверждено
return;
info.vm.ShowOkPopup("Тестовое окно", "Сообщение показано с помощью SamplePlugin.");
}
В этом случае окно запроса прав будет показываться всегда.
Вариант 4: Проверка нескольких прав.
Можно показать окно проверки нескольких прав, например:
private void ShowOkPopupOnPaymentScreen((IOrder order, IOperationService os, IViewManager vm, (Guid buttonId, string caption, bool isChecked, string iconGeometry) state) info)
{
if (info.vm.ShowCheckPermissionsPopup(new string[] { "F_XR", "F_ZREP" }, false, PermissionsCheckMode.Any) == null) //Права не были подтверждены
return;
info.vm.ShowOkPopup("Тестовое окно", "Сообщение показано с помощью SamplePlugin.");
}
Метод ShowCheckPermissionsPopup
принимает на вход 3 аргумента:
string[] permissionCodes
— права, которые будут проверяться у текущего пользователя.bool showConfirmPopupAnyway
— если false, то окно покажется только в случае отсутствия права у текущего пользователя. Если true, то окно покажется, даже если пользователь обладает нужным правом.PermissionsCheckMode
checkMode
— проверять наличие всех прав (PermissionsCheckMode.All
), или хотя бы одного (PermissionsCheckMode.Any
).
Метод возвращает экземпляр IUser
— пользователь, который подтвердил права, либо null
, если права не были подтверждены.