Иногда бывает необходимо скриптом ограничить доступ на портал для тех или иных пользователей. Чтобы сделать это, создадим простой бизнес-процесс (далее по тексту: БП) с использованием функций denyAccess() и grantAccess() для блокировки и разблокировки внешнего пользователя соответственно. Подробнее об этих функциях можно прочитать в tssdk.
Создадим БП, в котором настроим задачу и два блока сценария.
Карта БП:
В контекст БП добавим поле «Внешний пользователь» типа «Приложение – Внешние пользователи».
Это поле выносим на форму задачи и делаем обязательным. Из задачи настраиваем два перехода: «Блокировать» и «Разблокировать», которые ведут в соответствующие блоки сценария.
В блоках сценария размещаем код блокировки и разблокировки пользователя. Для блокировки пишем функцию blockUser(), для разблокировки – unblockUser().
Полный код из вкладки «Сценарии»:
Код:
// функция блокировки пользователя
async function blockUser(): Promise<void> {
// получение профиля и пользователя
const {profile, user} = await getProfile();
if (!profile) {
return;
}
if (!user) {
return;
}
// получение объекта портала
const portal = await System.portals.get("supplier");
if (!portal) {
return;
}
// блокировка доступа на этом портале
await portal.denyAccess(profile);
}
// функция разблокировки пользователя
async function unblockUser(): Promise<void> {
// получение профиля и пользователя
const {profile, user} = await getProfile();
if (!profile) {
return;
}
if (!user) {
return;
}
// получение объекта портала
const portal = await System.portals.get("supplier");
if (!portal) {
return;
}
// блокировка доступа на этом портале
await portal.grantAccess(profile);
}
// функция получения профиля и пользователя
async function getProfile(): Promise<{ profile?: ApplicationItemRef<Application$_system_catalogs$_user_profiles$Data, Application$_system_catalogs$_user_profiles$Params>, user?: UserItem }> {
if (!Context.data.external_user) {
return {};
}
// получение поля email
const email = (await Context.data.external_user.fetch()).data.email;
if (!email) {
return {};
}
// определение пользователя UserItem по email
const user = await System.users.search().where((f, g) => g.and(f.__deletedAt.eq(null), f.email.eq(email))).first();
if (!user) {
return {};
}
// определение профиля по пользователю
const profile = await Context.fields.external_user.app.getByUser(user);
return {profile, user};
}
В данном коде нужно сначала получить объект пользователь типа UserItem, затем по нему найти профиль пользователя, далее найти портал, для которого будет блокироваться пользователь, и затем воспользоваться функцией блокировки или разблокировки.
Чтобы найти портал, нужно воспользоваться функцией System.portal.get(), для которой в качестве параметра вводим значение кода раздела, в котором находится портал. В данном коде портал находится в разделе, у которого code равен «supplier». Подробнее про эту функцию и другие функции портала можно прочитать в tssdk.
Попробуем протестировать функционал. Запустим БП, выберем внешнего пользователя на задаче, которого хотим заблокировать/разблокировать. С помощью кнопок перехода выберем желаемое действие: блокировка или разблокировка.
Сперва попробуем заблокировать пользователя.
Проверим результат. Если мы написали все правильно, то при попытке зайти под выбранным внешним пользователем на портал, то увидим надпись «403 access deny»:
Снова запустим БП и на этот раз разблокируем пользователя. Убедимся, что снова открывается обычная страница портала.
Таким образом можно блокировать и разблокировать пользователей скриптом.
Последнее редактирование: 31 авг 2023