Wie kann der Zugriff auf die Site während der Entwicklung eingeschränkt werden?

17

Ich erstelle eine neue Drupal 7-basierte Site.

Die Entwicklung erfolgt auf einem öffentlich zugänglichen Server. Ich arbeite in einer Umgebung mit mehreren Standorten.

Ich möchte den Zugriff auf die Website für alle und alles andere als autorisierte Benutzer vollständig sperren. Einschließlich Zugriff auf den Site-Namen, das Thema usw.

Ich habe Secure Site zuvor für ähnliche Aufgaben verwendet. Es hat eine Authentifizierung auf http-Ebene durchgeführt und 403 zurückgegeben, wenn die Authentifizierung fehlgeschlagen ist. Es gibt keine D7-Version.

Was wäre der einfachste Weg, dies zu tun?

Daphshez
quelle

Antworten:

15

Erstellen Sie ein Modul und fügen Sie folgenden Code in Ihre Moduldatei ein:

<?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;
}

Hierbei wird die HTTP-Authentifizierung verwendet und in der Drupal-Datenbank nach einem gültigen Benutzernamen und Kennwort gesucht.

Wenn Sie Probleme mit PHP CLI, Drush oder cron haben, können Sie den folgenden Code in den Hook einfügen:

  // 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;
    }
  }
Bart
quelle
Das wird Ihre Drush-Umgebung komplett durcheinander bringen. Zusätzliche positive Bewertungen von mir, wenn Sie eine Problemumgehung für Drush erstellen.
Lester Peabody
Fertig, erweiterter Ansatz mit PHP CLI und cron.php.
Bart
1
Heiß. Schnelle Antwort auch. Ich würde es noch einmal hochstimmen, wenn ich könnte.
Lester Peabody
Dies funktioniert überhaupt nicht mit Drupal 8
DrCord 20.06.16
Daher wird dies als Drupal 7 markiert.
Bart
4

Wenn Sie Drupal 7 verwenden, ist das Shield- Modul für diesen Zweck verfügbar. Es authentifiziert einen einzelnen, gemeinsam genutzten Benutzer und ein Passwort.

PHP-Authentifizierungsschild. Es erstellt einen einfachen Schutz für die Site mit Apache-Authentifizierung. Es verbirgt die Sites, wenn der Benutzer keinen einfachen Benutzernamen / Passwort kennt. Es behandelt Drupal als "ummauerten Garten". Dieses Modul hilft Ihnen, Ihre (Entwickler-) Site mit HTTP-Authentifizierung zu schützen.

Johnathan Elmore
quelle
+1 - Das Rad nicht neu erfinden. Dies ist bereits erledigt und berücksichtigt unterschiedliche Serverkonfigurationen und Drush.
Adam Balsam
2

In mod_authApache - Setup. Dies hängt von Ihrem Host ab (Linux, Windows). Dies kann das Herunterladen eines Moduls und das Auskommentieren einer Zeile in Ihrer httpd.conf beinhalten

 LoadModule auth_basic_module modules/mod_auth_basic.so

Erstellen Sie eine .htpasswd-Datei mit dem htpasswdBefehl im Apache Binaries-Ordner

 htpasswd -c user pass

Fügen Sie der <DIRECTORY>Anweisung unmittelbar nach der Neuschreibungsregel für saubere URLs den folgenden Code hinzu :

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

Starten Sie Apache neu. Profitieren.

Alex C
quelle
Vielen Dank. Ich kann diese Lösung nicht testen, da sich dieses Projekt im Shared Hosting befindet und ich keinen Zugriff auf die httpd.conf habe. Ich frage mich jedoch, ob dies überhaupt in einer Umgebung mit mehreren Standorten funktionieren kann.
Daphshez
Haben Sie Zugriff auf die .htaccessDatei in Drupal Root? Ich bin mir nicht zu 100% sicher, aber Sie können versuchen, es dort einzubauen. Wohlgemerkt, Bart's Lösung scheint viel besser zu sein :)
Alex C
Siehe meine Antwort an Dan. Ich kann die .htaccess-Datei ändern, bin mir jedoch nicht sicher, wie sie mir bei einer Konfiguration mit mehreren Standorten hilft.
Daphshez
Dies ist zwar eine gute Lösung, aber Sie können keine Social-Sharing-Funktionen damit testen.
Sukhjinder Singh
0

Das OP hat kommentiert, dass dies auf Shared Hosting ist. Die meisten gemeinsam genutzten Hosts bieten cPanel oder ein anderes Steuerungsfeld, mit dem Verzeichnisse einfach mit einem .htaccess-Kennwort geschützt werden können.

Mit dieser Methode habe ich das oberste Verzeichnis einer Site geschützt, die sich in der Entwicklung befindet. Wenn Sie das Verzeichnis mit cPanel schützen, suchen Sie den Menüpunkt "Kennwortschutz für Verzeichnisse".

Wenn Sie das oberste Verzeichnis schützen, bevor Sie Drupal installieren, erstellt cPanel eine .htaccess-Datei in diesem Verzeichnis. Fügen Sie dem Inhalt dieser Datei die von Drupal bereitgestellte .htaccess-Datei hinzu oder stellen Sie sie voran. Wenn Sie das Verzeichnis nach der Installation von Drupal schützen, ist es ziemlich sicher, dass cPanel der vorhandenen Drupal .htaccess-Datei nur die Zeilen hinzufügt, die es benötigt, und den Rest der Datei nicht stört. Stellen Sie einfach sicher, dass Sie diese Zeilen beibehalten, wenn Sie die .htaccess-Datei während eines Drupal-Upgrades ersetzen.

Dan Halbert
quelle
Danke, ich habe tatsächlich auch Shell-Zugriff. Aber kann ich htaccess (oder httpd.conf) verwenden, wenn ich nur eine Site in einer Konfiguration mit mehreren Sites schützen möchte?
Daphshez
Entschuldigung, ich habe den Kommentar für mehrere Websites im OP verpasst. Ich benutze keine Multi-Site, aber ich habe nachgeschlagen, wie es funktioniert. Da Drupal Multi-Site ein einziges Verzeichnis der Lösungen auf oberster Ebene verwendet, würde meines Erachtens nur Bart's funktionieren. Vielleicht können Sie die Entwickler-Site auch im Wartungsmodus ausführen, um alle außer dem Administrator zu sperren. Sehen Sie hier einige Hinweise.
Dan Halbert