Http basic Authorization — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 97: Строка 97:
 
         }
 
         }
 
     }
 
     }
     header("Location: http://shpatler.ru/admin/news/lists");
+
     header("Location: http://domain.ru/admin/news/lists");
 
?>
 
?>
 
</source>
 
</source>

Версия 15:51, 12 февраля 2016

Актуально для версии 2.9.5

Задача

Закрыть страницу /admin дополнительной http авторизацией.

Решение

Для решения задачи в .htaccess добавьте строку:

RewriteCond %{REQUEST_URI} ^(/admin)$
RewriteRule ^(.) /security/check.php [L,R]

Потом создайте в корневой директории папку "security" и положите в нее:

1) файл .htpasswd, о том как его получить и заполнить данными можно прочитать, например, вот здесь.

2) файл .htaccess следующего содержания:

AuthType Basic
AuthName "private area"
AuthUserFile /home/domains/c-cmac/htdocs/security/.htpasswd
require valid-user
  • в AuthName укажите желаемое сообщение в форме авторизации.
  • в AuthUserFile укажите абсолютный путь до файла .htpasswd, см. 1).

3) php файл check.php следующего содержания:

<?php
include '../standalone.php';

$buffer = new HTTPOutputBuffer;
$buffer->redirect("/admin/news/lists/", '301 Moved Permanently', 301);
?>

Тогда, при запросе имя_вашего_сайта/admin, браузер затребует ввести авторизационные данные, если они будут введены верно, то произойдет редирект на стандартную форму авторизации в административную панель UMI.CMS.

Basic http auth.png

Если Вы не хотите, еще раз вводить те же данные, то можете внести правки в файл check.php:

include '../standalone.php';
 
$login = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];
 
$buffer = new HTTPOutputBuffer;
$buffer->redirect("/admin/news/lists/?u-login=$login&u-password=$pass", '301 Moved Permanently', 301);
  • Из-за особенностей архитектуры UMI.CMS второй версии полноценно закрыть всю административную панель этим способом не получится, но можно хотя бы закрыть самый очевидный адрес /admin.


Иногда из-за особенностей хостинга данный способ может не сработать, тогда можно дополнительно закрыть административную панель паролем, заменив код в файле check.php на следующий:

<?php
    include '../standalone.php';
	
    $login = 'admin';
    $pass = '4297f44b13955235245b2497399d7a93';  // md5 123123

    if (!isset($_COOKIE['test_umi'])){
        if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
            // Имя пользователя и/или пароль не были введены, поэтому отправляются заголовки аутентификации
            header('HTTP/1.1 401 Unauthorized');
            header('WWW-Authenticate: Basic Realm="test-umi"');
            exit('Вам необходимо ввести правильные имя пользователя и пароль, '.
            'иначе вы не получите доступ к этой странице');
        }
		
        // Получение введенных пользователем данных для аутентификации
        $user_userlogin = trim($_SERVER['PHP_AUTH_USER']);
        $user_password = md5(trim($_SERVER['PHP_AUTH_PW']));

        if ($login == $user_userlogin && $pass == $user_password ) {
            // Процедура входа прошла нормально, дальше что-то делаем.
            $sessionId = md5(time());
            setcookie('test_umi', $sessionId, time() + (60 * 60 * 24 * 30));
            $_COOKIE['test_umi'] = $sessionId;	 
        } else {
            // Имя пользователя и/или пароль введены неверно, поэтому отправляются заголовки аутентификации
            header('HTTP/1.1 401 Unauthorized');
            header('WWW-Authenticate: Basic Realm="test-umi"');
            exit('Вам необходимо ввести правильные имя пользователя и пароль, '.
            'иначе вы не получите доступ к этой странице');
        }
    }
    header("Location: http://domain.ru/admin/news/lists");
?>

где 'admin' - это нужный пароль, '4297f44b13955235245b2497399d7a93' - пароль зашифрованный в md5, 'domain.ru' - адрес Вашего сайта.