Как закрыть страницу авторизацией программно?

  • Как закрыть страницу авторизацией программно?

    Антон Долганин 20 Октября 2015 7:18 4308
    Иногда бывает необходимость закрыть доступ к определенной страницей верхним уровнем прав - то есть до исполнения контентной части страницы. И доступа к самой странице у вас нет. Например, это корпортал, и надо закрыть выборочно доступ к некоторым сотрудникам.

    Что делать? Как правильно? Вот простой обработчик:
    AddEventHandler('main', 'OnBeforeProlog', 'OnBeforeProlog');
    function OnBeforeProlog()
    {
       $page = $GLOBALS['APPLICATION']->getCurPage();
       //доступ к карточке юзера
       if (preg_match('#'.SITE_DIR.'company/personal/user/([\d]+)/#i', $page, $matches)) {
          if ($GLOBALS['USER']->getId() != $matches[1]) {
             //пересечения по департаментам отсутствуют
             $commonDeps = array_intersect(getAllowedDepartments($matches[1], true), getAllowedDepartments(false, true));
             if (empty($commonDeps)) {
                $GLOBALS['APPLICATION']->AuthForm(array('MESSAGE' => 'Доступ к странице запрещен', 'TYPE' => 'ERROR'));
             }
          }
       }
    } 


    Вы уже догадались, что ключевое тут $GLOBALS['APPLICATION']->AuthForm.

    Получим полноценную авторизацию, при которой недоступен даже заголовок страницы. Это полностью по правилам продукта, ибо, если заглянем в /bitrix/modules/include.php в самый конец, увидим там аналогичную проверку на доступ:

    2015-10-20_10-23.png


    То бишь, мы просто эмулируем такую вот проверку самостоятельно.