• Блог
  • Маскировка админки

Всем привет! В этой заметке я расскажу про очередной велосипед о том, как замаскировать вход в админку MODX. Первый свой вариант я реализовал в модуле AdminTools. Там для авторизации пользователя в бэкэнд используется адрес web-ресурса с формой с одним полем, в которое нужно ввести логин или email. MODX по введённым данным попробует найти пользователя и, если найдёт, то на указанный email вышлет ссылку для авторизации. Т.е. адрес админки не светится и пароли помнить не нужно. Главное, чтобы указанный пользователь был в базе, у него были права на вход в админку и настроенный email.

А в этом варианте я предлагаю скрывать админку с использованием GET параметра. Для реализации этого решения нужно создать плагин на событие OnManagerPageInit.

<?php
switch ($modx->event->name) {
  case 'OnManagerPageInit':
    // Вариант 1. Сразу задать значение GET параметра.
    $code = 2016; 
    // Вариант 2. Создать системную настройку adminCode и в ней выставить значение
    // $code = $modx->getOption('adminCode');
    
    // Тут мы проверяем GET параметр code
    if ($modx->user->id == 0 && (!isset($_GET['code']) || $_GET['code'] != $code)) {
      // Определяем заголовок страницы и тело. Можно оставить значения по-умолчанию. 
      // Тогда $options можно не использовать.
      $options = array(
	    'error_pagetitle' => 'Ошибка 404: Страница не найдена',
	    'error_message' => '<h1>Куды прешься</h1><p>Нету тут таких.</p>',
      );
      $modx->sendErrorPage($options); // Можно просто редиректить на какую-нибудь страницу.
    }
    break;
}

Теперь для того, чтобы попасть на страницу админки, нужно набрать правильный адрес с кодом site.ru/manager/?code=2016. В противном случае, получите страницу 404.

Ну и помним про обычные способы — базовая аутентификация (т.е. задать пароль на сервере) и переименование папки manager.

0   5100

Комментарии ()

  1. Андрей 27 октября 2016 # 0
    Я так полагаю, что это решение только для Revo?
    Сначала этого не понял, засунул в Evo — админка покрошилась. Пока не удалил плагин через БД и не почистил кэш — админка не работала.
    А можете делать так же, только для Evo? Очень надо, пожалуйста!:s
    1. Сергей Шлоков 27 октября 2016 # 0
      Я очень далек от Evo. Теоретически проблема может быть в названии события (проверьте, есть ли такое в Evo) и в существовании метода $modx->sendErrorPage(). Если нет, то заменить на аналог из Evo.
      1. Андрей 27 октября 2016 # 0
        Надо же. Оказывается есть в паблике этот хак для Evo, вот тут:
        Случайно нашел. Только переделал немножко.
        Код моей версии:
        if (!isset ($keyword) || empty($keyword)) return;
        $e = &$modx->Event;
        if ($e->name == "OnManagerLoginFormPrerender" && !isset($_GET[$keyword])) $this->sendErrorPage();
        return;
        И настройки:
        "keyword": [{"label": "Keyword","type": "string","value": "secure", "default": "secure","desc": ""}]
        Ну и событие: OnManagerLoginFormPrerender

        Отличие моей версии — происходит редирект на страницу 404. Как это прописать кодом в настройках я не знаю, поэтому прописал в коде самого плагина.
        Чуть не забыл, доступ к админке по адресу типа:
        site.ru/manager/?secure
        1. Алексей 31 октября 2016 # 0
          А можно для для Evo поподробнее. Что куда и как.
    2. Александр 18 ноября 2016 # 0
      Сергей, что то на revo $modx->sendErrorPage(14); не отрабатывает переадресация. может я не правильно вставляю что то?
      1. Сергей Шлоков 18 ноября 2016 # 0
        Андрей, в метод sendErrorPage передаётся массив параметров. Если вы хотите переадресовать на страницу с id=14, нужно передать массив
        $modx->sendErrorPage(array('error_page'=>14));
        Или ничего не передавать. Но тогда страницу для ошибки 404 нужно определить в системном параметре «error_page».
        1. Александр 18 ноября 2016 # 0
          спасибо, за помощь юзеру))
          но что то не срабатывает. выдает: 503 Error

      Вы должны авторизоваться, чтобы оставлять комментарии.

      Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.