...

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

Тема в разделе "Скрипты и разработка", создана пользователем 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