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?

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

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.


+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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.