Если нужно ограничить доступ к определённому каталогу web-сайта по логину и паролю, причём эти данные нужно хранить в базе данных MySQL, можно использовать модуль web-сервера Apache mod_auth_mysql. В этой статье я покажу простой пример настройки данного модуля, но, я решил немного улучшить защиту, добавив дополнительно к логину и паролю ограничение доступа по IP-адресу, диапазону IP-адресов, а также будет осуществляться проверка на активность/заблокированность пользователя.

Создание таблицы пользователей, добавление функции:

Для начала нужно создать базу данных ползователей (или использовать существующую, в примере используется база test). Я не буду подробно описывать работу с базой данных MySQL, думаю, те кому нужен данный модуль авторизации — способны изучить документацию к базе данных. Итак, создаём таблицу с пользователями, ввести в консоли базы MySQL (mysql test):

CREATE TABLE accounts (
  login VARCHAR(16) NOT NULL,
  password VARCHAR(64) NOT NULL,
  active TINYINT(1) NOT NULL DEFAULT 1,
  ip_range TEXT,
  PRIMARY KEY (login)
);

Пароль будет храниться в зашифрованном виде. Я использовал функцию unix_md5_crypt() из модуля Crypt::PasswdMD5, язык программирования Perl. Структура таблицы простая: имя пользователя, пароль в зашифрованном виде, признак активности (1 или 0), неактивных аторизировать не будем, и ограничение по IP. Если поле ip_range будет пустым, то проверка IP-адреса не будет осуществляться. Ограничения по IP записываются в следующем формате: если ограничений несколько, они разделяются запятой (без пробелов), если нужно ограничить доступ с диапазона IP-адресов, то диапазон записывается через чёрточку (без пробелов). Пример: «192.168.0.1,10.0.0.0-10.255.255.255,172.16.0.1». Проверить валидность данного поля можно следующим регулярным выражением:

^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(-((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))?(,((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(-((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))?)*$

Ограничения по IP осуществляются написанной мной хранимой функцией MySQL, ввести с консоли MySQL (mysql test):

DROP FUNCTION IF EXISTS ip_in_range;
DELIMITER //
CREATE FUNCTION ip_in_range (test_ip VARCHAR(15), ip_range TEXT)
RETURNS TINYINT(1)
BEGIN
  DECLARE temp TEXT;
  DECLARE coma INT(10);
  DECLARE ip BIGINT(10);
  IF ip_range IS NULL OR ip_range = '' THEN
    RETURN 1;
  END IF;
  SET ip = INET_ATON(test_ip);
  REPEAT
    SET coma = LOCATE(',', ip_range);
    IF coma = 0 THEN
      SET temp = ip_range;
      SET ip_range = '';
    ELSE
      SET temp = LEFT(ip_range, coma - 1);
      SET ip_range = RIGHT(ip_range, LENGTH(ip_range) - coma);
    END IF;
    SET coma = LOCATE('-', temp);
    IF coma = 0 THEN
      IF ip = INET_ATON(temp) THEN
        RETURN 1;
      END IF;
    ELSE
      IF ip >= INET_ATON(LEFT(temp, coma - 1)) AND ip <= INET_ATON(RIGHT(temp, LENGTH(temp) - coma)) THEN
        RETURN 1;
      END IF;
    END IF;
  UNTIL ip_range = '' END REPEAT;
  RETURN 0;
END;
//
DELIMITER ;

Настройка web-сервера:

Настраиваем httpd.conf, нужно добавить модуль и ограничить доступ к каталогу (в случае с тестируемой системой, Fedora 13, был установлен пакет mod_auth_mysql, и модуль автоматически прописался файлом конфигурации /etc/httpd/conf.d/auth_mysql.conf):

LoadModule mysql_auth_module modules/mod_auth_mysql.so

<Directory "/home/user/www">
  Options FollowSymLinks
  AllowOverride All
  AuthBasicAuthoritative Off
  AuthName "Authentication"
  AuthType Basic
  AuthMySQLEnable On
  AuthMySQLHost localhost
  AuthMySQLUser user
  AuthMySQLPassword password
  AuthMySQLDB test
  AuthMySQLUserTable accounts
  AuthMySQlNameField login
  AuthMySQLPasswordField password
  AuthMySQLUserCondition "active AND ip_in_range('%a', ip_range)"
  AuthMySQLPwEncryption crypt
  AuthUserFile /dev/null
  Require valid-user
</Directory>

Тут нужно скорректировать базу данных, если нужно (используется test), ну и ввести нужные имя пользователя с паролем (используется login и password).

Заключение:

Как видно из статьи, всё просто настраивается, даёт возможность гибко ограничивать доступ пользователей, изменяя данные в базе данных. Плюс мы получаем ограничение доступа блокированных пользователей, а так же получаем защиту от подбора паролей, открывая доступ только с определённых хостов.

Facebooktwittergoogle_plusredditpinterestlinkedintumblr

Comments

comments