...

Блокировка внешнего пользователя на портале

Тема в разделе "Примеры сценариев", создана пользователем vyimova, 31 авг 2023.

  1. vyimova

    vyimova Участник

    Иногда бывает необходимо скриптом ограничить доступ на портал для тех или иных пользователей. Чтобы сделать это, создадим простой бизнес-процесс (далее по тексту: БП) с использованием функций denyAccess() и grantAccess() для блокировки и разблокировки внешнего пользователя соответственно. Подробнее об этих функциях можно прочитать в tssdk.

    Создадим БП, в котором настроим задачу и два блока сценария.

    Карта БП:

    [​IMG]

    В контекст БП добавим поле «Внешний пользователь» типа «Приложение – Внешние пользователи».

    Это поле выносим на форму задачи и делаем обязательным. Из задачи настраиваем два перехода: «Блокировать» и «Разблокировать», которые ведут в соответствующие блоки сценария.

    В блоках сценария размещаем код блокировки и разблокировки пользователя. Для блокировки пишем функцию blockUser(), для разблокировки – unblockUser().

    Полный код из вкладки «Сценарии»:
    Код:
    
    // функция блокировки пользователя
    async function blockUser(): Promise<void> {
        
    // получение профиля и пользователя
        
    const {profileuser} = 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 {profileuser} = 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$DataApplication$_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((fg) => 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 {
    profileuser};
    }


    В данном коде нужно сначала получить объект пользователь типа UserItem, затем по нему найти профиль пользователя, далее найти портал, для которого будет блокироваться пользователь, и затем воспользоваться функцией блокировки или разблокировки.

    Чтобы найти портал, нужно воспользоваться функцией System.portal.get(), для которой в качестве параметра вводим значение кода раздела, в котором находится портал. В данном коде портал находится в разделе, у которого code равен «supplier». Подробнее про эту функцию и другие функции портала можно прочитать в tssdk.

    Попробуем протестировать функционал. Запустим БП, выберем внешнего пользователя на задаче, которого хотим заблокировать/разблокировать. С помощью кнопок перехода выберем желаемое действие: блокировка или разблокировка.

    [​IMG]

    Сперва попробуем заблокировать пользователя.

    Проверим результат. Если мы написали все правильно, то при попытке зайти под выбранным внешним пользователем на портал, то увидим надпись «403 access deny»:

    [​IMG]

    Снова запустим БП и на этот раз разблокируем пользователя. Убедимся, что снова открывается обычная страница портала.

    Таким образом можно блокировать и разблокировать пользователей скриптом.
    Последнее редактирование: 31 авг 2023