¿Cómo restringir el acceso al sitio durante el desarrollo?

17

Estoy creando un nuevo sitio basado en Drupal 7.

El desarrollo se realizará en un servidor que sea de acceso público. Estoy trabajando en un entorno multisitio.

Me gustaría bloquear totalmente el acceso al sitio a cualquier persona, excepto a los usuarios autorizados. Incluyendo acceso al nombre del sitio, tema, etc.

Utilicé Secure Site para tareas similares antes. Realizó la autenticación de nivel http y devolvió 403 cuando la autenticación falló. No tiene una versión D7.

¿Cuál sería la forma más fácil de hacer esto?

daphshez
fuente

Respuestas:

15

Cree un módulo y pegue el siguiente código en su archivo de módulo:

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

Esto utiliza la autenticación HTTP y verifica la base de datos de Drupal para un nombre de usuario y contraseña válidos.

Si tiene algún problema con PHP CLI, Drush o cron, puede agregar el siguiente código en el enlace:

  // 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
fuente
Palabra sabia, esto arruinará por completo su entorno Drush. Votos a favor adicionales de mi parte si crea una solución alternativa de Drush.
Lester Peabody
Hecho, se agregó un enfoque más amplio que incluye PHP CLI y cron.php.
Bart
1
Caliente. Respuesta rápida también. Lo votaría de nuevo si pudiera.
Lester Peabody
esto no funciona en absoluto con Drupal 8
DrCord
De ahí por qué esto está etiquetado como Drupal 7.
Bart
4

Si está utilizando Drupal 7, el módulo Shield está disponible para este propósito. Autentica un usuario y contraseña únicos y compartidos.

Escudo de autenticación de PHP. Crea un escudo simple para el sitio con autenticación Apache. Oculta los sitios, si el usuario no conoce un nombre de usuario / contraseña simple. Maneja a Drupal como un "jardín amurallado". Este módulo le ayuda a proteger su sitio (dev) con autenticación HTTP.

Johnathan Elmore
fuente
+1 - No reinventes la rueda. Esto ya está hecho y representa diferentes configuraciones de servidor y drush.
Adam Balsam
2

Agregar mod_autha la configuración de apache. Esto varía según su host (Linux, Windows). Esto puede implicar la descarga de un módulo, puede implicar simplemente descomentar una línea en su httpd.conf

 LoadModule auth_basic_module modules/mod_auth_basic.so

Cree un archivo .htpasswd, usando el htpasswdcomando en la carpeta binarios de apache

 htpasswd -c user pass

Agregue el siguiente código a su <DIRECTORY>estado de cuenta justo después de que su URL limpia reescriba la regla:

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

Reiniciar apache. Lucro.

Alex C
fuente
Gracias. No puedo probar esta solución ya que este proyecto está en un alojamiento compartido y no tengo acceso a httpd.conf. Sin embargo, me pregunto si esto puede funcionar en un entorno multisitio.
daphshez
¿tiene acceso al .htaccessarchivo en drupal root? No estoy 100% seguro, pero puedes intentar ponerlo allí. Eso sí, la solución de Bart parece mucho mejor :)
Alex C
mira mi respuesta a Dan. Puedo cambiar el .htaccess, pero no estoy seguro de cómo me ayuda en una configuración de sitios múltiples.
daphshez
Aunque esta es una buena solución, no puedes probar las funciones de intercambio social con ella.
Sukhjinder Singh
0

El OP ha comentado que esto es en alojamiento compartido. La mayoría de los alojamientos compartidos proporcionan cPanel o algún otro panel de control, que hará una simple protección de contraseña .htaccess para directorios.

He protegido el directorio de nivel superior de un sitio en desarrollo utilizando este método. Si utiliza cPanel para proteger el directorio, busque el elemento de menú "Proteger directorios con contraseña".

Si protege el directorio de nivel superior antes de instalar Drupal, cPanel creará un archivo .htaccess en ese directorio. Agregue o anteponga el contenido de ese archivo con el archivo .htaccess que proporciona Drupal. Si protege el directorio después de instalar Drupal, estoy bastante seguro de que cPanel simplemente agregará las líneas que necesita al archivo .htaccess de Drupal existente y no perturbará el resto del archivo. Solo asegúrese de conservar esas líneas si reemplaza el archivo .htaccess durante una actualización de Drupal.

Dan Halbert
fuente
Gracias, en realidad también tengo acceso a shell. Pero, ¿puedo usar htaccess (o httpd.conf, para el caso) cuando quiero proteger solo un sitio en una configuración multisitio?
daphshez
Lo siento, me perdí el comentario de varios sitios en el OP. No uso multi-sitio, pero busqué cómo funciona. Dado que Drupal multi-site usa un único directorio de nivel superior, de las soluciones aquí, creo que solo Bart funcionaría. Tal vez también podría ejecutar el sitio de desarrollo en modo de mantenimiento, para bloquear a todos menos al administrador. Ver aquí para algunos consejos.
Dan Halbert