Come limitare l'accesso al sito durante lo sviluppo?


17

Sto creando un nuovo sito basato su Drupal 7.

Lo sviluppo sarà su un server accessibile al pubblico. Sto lavorando in un ambiente multi-sito.

Vorrei bloccare totalmente l'accesso al sito a chiunque, tranne agli utenti autorizzati. Compreso l'accesso al nome del sito, tema, ecc ...

Ho usato Secure Site per attività simili prima. Ha eseguito l'autenticazione a livello http e ha restituito 403 quando l'autenticazione non è riuscita. Non ha una versione D7.

Quale sarebbe il modo più semplice per farlo?

Risposte:


15

Crea un modulo e incolla il seguente codice nel file del modulo:

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

Questo utilizza l'autenticazione HTTP e controlla il database Drupal per un nome utente e una password validi.

In caso di problemi con l'interfaccia della riga di comando di PHP, Drush o cron, è possibile aggiungere il seguente codice all'hook:

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

Parola al saggio, questo rovinerà completamente l'ambiente Drush. Più voti da me se crei una soluzione alternativa Drush.
Lester Peabody,

Fatto, aggiunto un approccio più ampio che include PHP CLI e cron.php.
Bart,

1
Caldo. Anche una risposta rapida. Voterei nuovamente se potessi.
Lester Peabody,

questo non funziona affatto con Drupal 8
DrCord,

Quindi perché questo è etichettato come Drupal 7.
Bart

4

Se stai usando Drupal 7 il modulo Shield è disponibile per questo scopo. Autentica un singolo utente e password condivisi.

Scudo di autenticazione PHP. Crea un semplice scudo per il sito con autenticazione Apache. Nasconde i siti, se l'utente non conosce un semplice nome utente / password. Gestisce Drupal come un "giardino recintato". Questo modulo ti aiuta a proteggere il tuo sito (dev) con l'autenticazione HTTP.


+1 - Non reinventare la ruota. Questo è già stato fatto e tiene conto delle diverse configurazioni del server e del drush.
Adam Balsam,

2

Aggiungi mod_authalla configurazione di Apache. Questo varia a seconda del tuo host (Linux, Windows). Ciò può comportare il download di un modulo, può comportare il solo decommentamento di una riga nel tuo httpd.conf

 LoadModule auth_basic_module modules/mod_auth_basic.so

Crea un file .htpasswd, usando il htpasswdcomando nella cartella binari di apache

 htpasswd -c user pass

Aggiungi il seguente codice <DIRECTORY>all'istruzione subito dopo la regola di riscrittura degli URL puliti:

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

Riavvia apache. Profitto.


Grazie. Non riesco a testare questa soluzione poiché questo progetto è in hosting condiviso e non ho accesso a httpd.conf. Mi chiedo tuttavia se questo può funzionare affatto in un ambiente multi-sito.
daphshez,

hai accesso al .htaccessfile in drupal root? Non ne sono sicuro al 100%, ma puoi provare a inserirlo. Intendiamoci, la soluzione di Bart sembra molto meglio :)
Alex C

vedi la mia risposta a Dan. Posso modificare .htaccess, ma non sono sicuro di come mi aiuti in una configurazione multi-sito.
daphshez,

Anche se questa è una buona soluzione, ma non puoi testare le funzionalità di condivisione social con essa.
Sukhjinder Singh,


0

L'OP ha commentato che si tratta di hosting condiviso. La maggior parte dell'hosting condiviso fornisce cPanel o qualche altro pannello di controllo, che consentirà una semplice protezione con password .htaccess per le directory.

Ho protetto la directory di livello superiore di un sito in fase di sviluppo utilizzando questo metodo. Se si utilizza cPanel per proteggere la directory, cercare la voce di menu "Password Protect Directories".

Se proteggi la directory di livello superiore prima di installare Drupal, cPanel creerà un file .htaccess in quella directory. Aggiungi o anteponi il contenuto di quel file con il file .htaccess fornito da Drupal. Se proteggi la directory dopo aver installato Drupal, sono abbastanza sicuro che cPanel aggiungerà solo le righe necessarie al file .htaccess Drupal esistente e non disturberà il resto del file. Assicurati solo di conservare quelle righe se sostituisci il file .htaccess durante un aggiornamento di Drupal.


Grazie, in realtà ho anche accesso alla shell. Ma posso usare htaccess (o httpd.conf, per quella materia) quando voglio proteggere un solo sito in una configurazione multi-sito?
daphshez,

Spiacenti, ho perso il commento multi-sito nell'OP. Non utilizzo più siti, ma ho cercato come funziona. Poiché Drupal multi-site utilizza una sola directory di livello superiore, delle soluzioni qui, penso che solo Bart funzionerebbe. Forse potresti anche eseguire il sito di sviluppo in modalità manutenzione, per bloccare tutti tranne l'amministratore. Vedi qui per alcuni suggerimenti.
Dan Halbert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.