Como restringir o acesso ao site durante o desenvolvimento?

17

Estou criando um novo site baseado no Drupal 7.

O desenvolvimento será em um servidor acessível ao público. Estou trabalhando em um ambiente de vários sites.

Eu gostaria de bloquear totalmente o acesso ao site para qualquer pessoa, exceto usuários autorizados. Incluindo acesso ao nome do site, tema, etc ...

Eu usei o Secure Site para tarefas semelhantes antes. Ele fez autenticação no nível http e retornou 403 quando a autenticação falhou. Não possui uma versão D7.

Qual seria a maneira mais fácil de fazer isso?

daphshez
fonte

Respostas:

15

Crie um módulo e cole o seguinte código no seu arquivo 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;
}

Isso usa autenticação HTTP e verifica o banco de dados Drupal quanto a nome de usuário e senha válidos.

Se você tiver algum problema com o PHP CLI, Drush ou cron, poderá adicionar o seguinte código no gancho:

  // 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
fonte
Palavra para o sábio, isso vai estragar completamente o seu ambiente Drush. Upvotes extras de mim se você criar uma solução alternativa para o Drush.
Lester Peabody
Concluído, adicionou uma abordagem mais ampla que inclui o PHP CLI e o cron.php.
21613 Bart Bart
1
Quente. Resposta rápida também. Eu votaria novamente se pudesse.
Lester Peabody
isso não funciona em todos com Drupal 8
DrCord
Daí porque este é marcado como Drupal 7.
Bart
4

Se você estiver usando o Drupal 7, o módulo Shield estará disponível para esse fim. Ele autentica um único usuário e senha compartilhados.

Escudo de autenticação do PHP. Ele cria um escudo simples para o site com autenticação Apache. Ele oculta os sites, se o usuário não souber um nome de usuário / senha simples. Ele lida com o Drupal como um "jardim murado". Este módulo ajuda a proteger seu site (dev) com autenticação HTTP.

Johnathan Elmore
fonte
+1 - Não reinvente a roda. Isso já foi feito e é responsável por diferentes configurações de servidor e drush.
Adam Balsam
2

Adicionar mod_authà configuração do apache. Isso varia dependendo do seu host (linux, windows). Isso pode envolver o download de um módulo, pode envolver apenas descomentar uma linha no seu httpd.conf

 LoadModule auth_basic_module modules/mod_auth_basic.so

Crie um arquivo .htpasswd, usando o htpasswdcomando na pasta binários apache

 htpasswd -c user pass

Adicione o seguinte código à sua <DIRECTORY>declaração logo após a regra de reescrita dos URLs limpos:

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

Reinicie o apache. Lucro.

Alex C
fonte
Obrigado. Não posso testar esta solução, pois este projeto está em hospedagem compartilhada e não tenho acesso ao httpd.conf. Gostaria de saber, no entanto, se isso pode funcionar em um ambiente de vários sites.
Daphshez
você tem acesso ao .htaccessarquivo na raiz drupal? Não tenho 100% de certeza, mas você pode tentar colocá-lo lá. Mente-lhe, solução de Bart parece muito melhor :)
Alex C
veja minha resposta para Dan. Posso alterar o .htaccess, mas não tenho certeza de como ele me ajuda em uma configuração de vários sites.
Daphshez 09/09
Embora essa seja uma boa solução, você não pode testar os recursos de compartilhamento social com ela.
Sukhjinder Singh
0

O OP comentou que isso é em hospedagem compartilhada. A maioria das hospedagem compartilhada fornece cPanel ou algum outro painel de controle, que oferece proteção simples por senha .htaccess para diretórios.

Eu protegi o diretório de nível superior de um site em desenvolvimento usando esse método. Se você usar o cPanel para proteger o diretório, procure o item de menu "Diretórios de proteção por senha".

Se você proteger o diretório de nível superior antes de instalar o Drupal, o cPanel criará um arquivo .htaccess nesse diretório. Anexe ou anexe o conteúdo desse arquivo ao arquivo .htaccess fornecido pelo Drupal. Se você proteger o diretório após a instalação do Drupal, tenho certeza de que o cPanel apenas adicionará as linhas necessárias ao arquivo .htaccess Drupal existente e não perturbará o restante do arquivo. Apenas certifique-se de preservar essas linhas se substituir o arquivo .htaccess durante uma atualização do Drupal.

Dan Halbert
fonte
Obrigado, eu também tenho acesso ao shell. Mas posso usar o htaccess (ou httpd.conf, nesse caso) quando quiser proteger apenas um site em uma configuração de vários sites?
Daphshez 09/09
Desculpe, perdi o comentário de vários sites no OP. Não uso vários sites, mas procurei como ele funciona. Como o multi-site do Drupal usa um único diretório de nível superior, das soluções aqui, acho que apenas o Bart funcionaria. Talvez você também possa executar o site dev no modo de manutenção, para bloquear todos, exceto o administrador. Veja aqui algumas dicas.
Dan Halbert