Как ограничить доступ к сайту при разработке?

17

Я создаю новый сайт на Drupal 7.

Разработка будет на сервере, который является общедоступным. Я работаю в многосайтовой среде.

Я хотел бы полностью заблокировать доступ к сайту для всех, кроме авторизованных пользователей. Включая доступ к названию сайта, теме и т.д ...

Я использовал Secure Site для подобных задач раньше. Он произвел аутентификацию на уровне http и возвратил 403, когда аутентификация не удалась. У него нет версии D7.

Что было бы самым простым способом сделать это?

daphshez
источник

Ответы:

15

Создайте модуль и вставьте следующий код в файл модуля:

<?php

/**
 * Implementation of hook_boot().
 *
 * Ask for user credentials and try to authenticate.
 */
function foo_boot() {
  require_once DRUPAL_ROOT . '/includes/password.inc';

  if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
    $query = "SELECT pass FROM {users} WHERE name = :name";
    $result = db_query($query, array(':name' => $_SERVER['PHP_AUTH_USER']));
    $account = new stdClass();
    foreach ($result as $row) {
      $account->pass = $row->pass;
    }
    if (isset($account->pass)) {
      if (user_check_password($_SERVER['PHP_AUTH_PW'], $account)) {
        return;
      }
    }
  }

  header('WWW-Authenticate: Basic realm="Development"');
  header('HTTP/1.0 401 Unauthorized');
  exit;
}

При этом используется HTTP-аутентификация и проверяется база данных Drupal на правильное имя пользователя и пароль.

Если у вас возникли проблемы с PHP CLI, Drush или cron, вы можете добавить в код следующий код:

  // Allow cron through
  if (basename($_SERVER['PHP_SELF']) == 'cron.php') {
    return;
  }  

  // Allow PHP CLI/Drush through
  if (isset($_SERVER['argc'])) {
    if (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)) {
      return;
    }
  }
Барт
источник
Слово мудрому, это полностью испортит вашу среду Drush. Дополнительные отзывы от меня, если вы создадите обходной путь Drush.
Лестер Пибоди
Готово, добавлен более широкий подход, включающий PHP CLI и cron.php.
Барт
1
Горячий. Быстрый ответ тоже. Я бы проголосовал снова, если бы мог.
Лестер Пибоди
это не работает вообще с Drupal 8
DrCord
Следовательно, почему это помечено как Drupal 7.
Барт
4

Если вы используете Drupal 7, модуль Shield доступен для этой цели. Он аутентифицирует одного общего пользователя и пароль.

Щит аутентификации PHP. Это создает простой щит для сайта с проверкой подлинности Apache. Он скрывает сайты, если пользователь не знает простого имени пользователя / пароля. Он обращается с Drupal как «огороженный сад». Этот модуль поможет вам защитить ваш (dev) сайт с помощью HTTP-аутентификации.

Джонатан Элмор
источник
+1 - Не изобретай велосипед. Это уже сделано и учитывает различные конфигурации сервера и drush.
Адам Бальзам
2

Добавьте mod_authк настройке apache. Это зависит от вашего хоста (Linux, Windows). Это может включать в себя загрузку модуля, это может включать просто раскомментирование строки в вашем httpd.conf

 LoadModule auth_basic_module modules/mod_auth_basic.so

Создайте файл .htpasswd, используя htpasswdкоманду в папке apache binaries

 htpasswd -c user pass

Добавьте следующий код в свое <DIRECTORY>заявление сразу после правила перезаписи чистых URL:

AuthType Basic
AuthName "My Auth"
AuthUserFile \path\to\.htpasswd
Require valid-user

Перезапустите Apache. Прибыль.

Алекс С
источник
Благодарю. Я не могу протестировать это решение, так как этот проект находится на виртуальном хостинге, и у меня нет доступа к httpd.conf. Интересно, однако, может ли это вообще работать в многосайтовой среде.
Дафшез
у вас есть доступ к .htaccessфайлу в корне drupal? Я не уверен на 100%, но вы можете попробовать поставить его там. Имейте в виду, решение Барта кажется намного лучше :)
Alex C
смотри мой ответ Дэну. Я могу изменить .htaccess, но я не уверен, как он помогает мне в конфигурации с несколькими сайтами.
Дафшез
Хотя это хорошее решение, но вы не можете протестировать с ним функции социального обмена.
Сукхиндер Сингх
0

ОП прокомментировал, что это на виртуальном хостинге. Большинство виртуальных хостингов предоставляют cPanel или какую-либо другую панель управления, которая обеспечивает простую защиту паролем .htaccess для каталогов.

С помощью этого метода я защитил каталог верхнего уровня разрабатываемого сайта. Если вы используете cPanel для защиты каталога, найдите пункт меню «Защита паролем каталогов».

Если вы защищаете каталог верхнего уровня перед установкой Drupal, cPanel создаст файл .htaccess в этом каталоге. Добавьте или добавьте содержимое этого файла вместе с файлом .htaccess, который предоставляет Drupal. Если вы защищаете каталог после установки Drupal, я уверен, что cPanel просто добавит необходимые строки в существующий файл .htaccess Drupal и не будет мешать остальной части файла. Просто убедитесь, что вы сохранили эти строки, если вы замените файл .htaccess во время обновления Drupal.

Дэн Халберт
источник
Спасибо, у меня тоже есть доступ к оболочке. Но могу ли я использовать htaccess (или httpd.conf, если на то пошло), когда я хочу защитить только один сайт в конфигурации с несколькими сайтами?
Дафшез
Извините, я пропустил многосайтовый комментарий в ОП. Я не использую мультисайты, но я посмотрел, как это работает. Так как Drupal multi-site использует один каталог верхнего уровня, из решений здесь, я думаю, будет работать только Барт. Возможно, вы также можете запустить сайт разработчика в режиме обслуживания, чтобы заблокировать всех, кроме администратора. Смотрите здесь для некоторых советов.
Дэн Халберт