Як обмежити доступ до сайту під час розробки?


17

Я створюю новий сайт на базі Drupal 7.

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

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

Раніше я використовував безпечний сайт для подібних завдань. Він здійснив аутентифікацію на рівні http і повернув 403, коли аутентифікація не вдалася. Він не має версії D7.

Який був би найпростіший спосіб зробити це?

Відповіді:


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. Він приховує сайти, якщо користувач не знає просте ім’я користувача / пароль. Він поводиться з Друпалом як з «огородженим садом». Цей модуль допомагає захистити ваш (розроблений) сайт за допомогою аутентифікації HTTP.


+1 - Не винаходити колесо. Це вже зроблено, і рахунки для різних конфігурацій сервера та друку.
Адам Бальзам

2

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

 LoadModule auth_basic_module modules/mod_auth_basic.so

Створіть .htpasswd файл, використовуючи htpasswdкоманду в папці бінарних файлів apache

 htpasswd -c user pass

Додайте наступний код до <DIRECTORY>заяви після того, як ваші чисті URL-адреси переписують правило:

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

Перезапустіть апаш. Прибуток.


Спасибі. Я не можу перевірити це рішення, оскільки цей проект перебуває у спільному хостингу, і я не маю доступу до httpd.conf. Мені цікаво, однак, чи може це взагалі працювати в середовищі з декількома сайтами.
дафшез

у вас є доступ до .htaccessфайлу в корінні файли drupal? Я не впевнений на 100%, але ви можете спробувати помістити його туди. Зауважте, рішення Барта здається набагато кращим :)
Alex C

дивіться мою відповідь Дану. Я можу змінити .htaccess, але я не впевнений, як це допомагає мені в конфігурації багатьох сайтів.
дафшез

Хоча це гарне рішення, але ви не можете перевірити функції соціального обміну за допомогою нього.
Sukhjinder Singh


0

ОП прокоментувало, що це стосується спільного хостингу. Більшість спільних хостингів забезпечує cPanel або якусь іншу панель управління, яка дозволить зробити простий захищений паролем .htaccess для каталогів.

Я захистив каталог верхнього рівня веб-сайту, що розробляється, за допомогою цього методу. Якщо ви використовуєте cPanel для захисту каталогу, знайдіть пункт меню "Каталог захищених паролем".

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


Дякую, у мене теж є доступ до оболонки. Але чи можу я використовувати htaccess (або httpd.conf, з цього приводу), коли хочу захистити лише один сайт у конфігурації багатьох сайтів?
daphshez

Вибачте, я пропустив коментар на багатьох сайтах в ОП. Я не використовую мультисайт, але я подивився, як це працює. Оскільки Drupal на багатьох сайтах використовує єдиний рейтинг найвищого рівня, з рішень тут, я думаю, що тільки Барт спрацював би. Можливо, ви також можете запустити сайт розробників у режимі обслуговування, щоб заблокувати всіх, крім адміністратора. Дивіться тут кілька підказок.
Ден Халберт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.