Comment restreindre l'accès au site pendant le développement?

17

Je crée un nouveau site basé sur Drupal 7.

Le développement se fera sur un serveur accessible au public. Je travaille dans un environnement multi-sites.

Je voudrais bloquer totalement l'accès au site à toute personne et tout sauf aux utilisateurs autorisés. Y compris l'accès au nom du site, au thème, etc ...

J'ai utilisé Secure Site pour des tâches similaires auparavant. Il a fait une authentification de niveau http et a renvoyé 403 lorsque l'authentification a échoué. Il n'a pas de version D7.

Quelle serait la façon la plus simple de procéder?

daphshez
la source

Réponses:

15

Créez un module et collez le code suivant dans votre fichier de module:

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

Cela utilise l'authentification HTTP et vérifie la base de données Drupal pour un nom d'utilisateur et un mot de passe valides.

Si vous avez des problèmes avec PHP CLI, Drush ou cron, vous pouvez ajouter le code suivant dans le 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;
    }
  }
Bart
la source
Parole aux sages, cela va complètement visser votre environnement Drush. Des votes supplémentaires de ma part si vous créez une solution de contournement Drush.
Lester Peabody
Terminé, a ajouté une approche plus large qui inclut PHP CLI et cron.php.
Bart
1
Chaud. Réponse rapide aussi. Je voterais à nouveau si je le pouvais.
Lester Peabody
cela ne fonctionne pas du tout avec Drupal 8
DrCord
D'où la raison pour laquelle ceci est étiqueté Drupal 7.
Bart
4

Si vous utilisez Drupal 7, le module Shield est disponible à cet effet. Il authentifie un seul utilisateur et mot de passe partagés.

Bouclier d'authentification PHP. Il crée un bouclier simple pour le site avec l'authentification Apache. Il masque les sites, si l'utilisateur ne connaît pas un simple nom d'utilisateur / mot de passe. Il traite Drupal comme un "jardin clos". Ce module vous aide à protéger votre site (dev) avec l'authentification HTTP.

Johnathan Elmore
la source
+1 - Ne réinventez pas la roue. Cela est déjà fait et prend en compte les différentes configurations de serveur et le drush.
Adam Balsam
2

Ajoutez mod_authà la configuration d'Apache. Cela varie en fonction de votre hôte (linux, windows). Cela peut impliquer le téléchargement d'un module, cela peut impliquer de simplement décommenter une ligne dans votre httpd.conf

 LoadModule auth_basic_module modules/mod_auth_basic.so

Créez un fichier .htpasswd à l'aide de la htpasswdcommande du dossier des fichiers binaires apache

 htpasswd -c user pass

Ajoutez le code suivant à votre <DIRECTORY>relevé juste après votre règle de réécriture des URL propres:

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

Redémarrez apache. Profit.

Alex C
la source
Merci. Je ne peux pas tester cette solution car ce projet est en hébergement mutualisé et je n'ai pas accès au httpd.conf. Je me demande cependant si cela peut fonctionner du tout dans un environnement multi-site.
daphshez
avez-vous accès au .htaccessfichier en racine drupal? Je ne suis pas sûr à 100%, mais vous pouvez essayer de le mettre là-dedans. Attention, la solution de Bart semble bien meilleure :)
Alex C
voir ma réponse à Dan. Je peux changer le .htaccess, mais je ne sais pas comment cela m'aide dans une configuration multi-sites.
daphshez
Bien que ce soit une bonne solution, vous ne pouvez pas tester les fonctionnalités de partage social avec.
Sukhjinder Singh
0

Le PO a indiqué qu'il s'agissait d'un hébergement partagé. La plupart des hébergements partagés fournissent cPanel ou un autre panneau de contrôle, qui fera une simple protection par mot de passe .htaccess pour les répertoires.

J'ai protégé le répertoire de niveau supérieur d'un site en développement en utilisant cette méthode. Si vous utilisez cPanel pour protéger le répertoire, recherchez l'élément de menu "Password Protect Directories".

Si vous protégez le répertoire de niveau supérieur avant d'installer Drupal, cPanel créera un fichier .htaccess dans ce répertoire. Ajoutez ou ajoutez le contenu de ce fichier au fichier .htaccess fourni par Drupal. Si vous protégez le répertoire après avoir installé Drupal, je suis presque sûr que cPanel ajoutera simplement les lignes dont il a besoin au fichier Drupal .htaccess existant et ne dérangera pas le reste du fichier. Assurez-vous simplement de conserver ces lignes si vous remplacez le fichier .htaccess lors d'une mise à niveau Drupal.

Dan Halbert
la source
Merci, j'ai aussi un accès shell. Mais puis-je utiliser htaccess (ou httpd.conf, d'ailleurs) lorsque je veux protéger un seul site dans une configuration multi-sites?
daphshez
Désolé, j'ai raté le commentaire multisite dans le PO. Je n'utilise pas le multi-site, mais j'ai cherché à savoir comment cela fonctionne. Étant donné que Drupal multi-site utilise un seul répertoire de niveau supérieur, des solutions ici, je pense que seul Bart fonctionnerait. Peut-être que vous pourriez également exécuter le site de développement en mode maintenance, pour verrouiller tout le monde sauf l'administrateur. Voir ici pour quelques conseils.
Dan Halbert