Pergunta

Configurei a autenticação htpasswd em meu site ativo e funciona muito bem, mas não quero que uma senha seja solicitada quando estiver trabalhando no ambiente de desenvolvimento.

No meu arquivo httpd.conf eu tenho:

SetEnv APP_ENV "development"

No meu .htaccess arquivo que tenho:

AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /dev/null
require valid-user

Eu queria saber se havia alguma maneira de colocar uma condicional em torno do material htppasswd para que quando APP_ENV é development que não seja solicitada uma senha.

Isso é possível?

Foi útil?

Solução

Se você puder, você deve pensar em atualizar para Apache 2.4 (ou a versão beta 2.3 mais recente, já que a 2.4 ainda não foi lançada).

Uma das novidades disponíveis é Contêineres de autorização - tornando muito mais simples definir requisitos de acesso usando o Exigir diretiva.

Você deve terminar com algo como:

AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /path/to/file/groups

SetEnv APP_ENV "development"

<RequireAll>
  <RequireAny>
    <RequireAll>
      #main requirements
      Require group user
      #other conditions if needed for non-dev/non-local
    </RequireAll>

    <RequireAll>
      #allow direct if development
      Require env APP_ENV development
    </RequireAll>

    <RequireAll>
      <RequireAny>
        #allow loopback and local network
        Require ip 127.0.0.1
        Require ip 10.2
      </RequireAny>
    </RequireAll>
  <RequireAny>

  #other conditions if needed for everyone

  <RequireNone>
    #blacklist
  </RequireNone>
</RequireAll>

Outras dicas

Uma das maneiras de construir blocos condicionais if com variáveis ​​​​env é usar mod_macro módulo.Eu fiz um exemplo anteriormente aqui.

Neste caso específico você teria no topo do arquivo VirtualHost (antes da definição do VirtualHost):

<Macro ConditionalBlockMacroSecurity_production>
    AuthName "Restricted Area"
    AuthType Basic
    AuthUserFile /path/to/file/.htpasswd
    AuthGroupFile /dev/null
    require valid-user
</Macro>
<Macro ConditionalBlockMacroSecurity_development >
    <IfModule mod_headers.c>
       Header set MyHeader "Hello this is DEVELOPMENT envirronment. It took %D microseconds for Apache to serve this request."
    </IfModule>
</Macro>

E dentro do Virtualhost:

Use ConditionalBlockMacroSecurity_${APP_ENV}

onde o caminho para o arquivo htpassword também pode ser definido como um parâmetro da macro.

A desvantagem desta solução é que você precisa instalar o mod_macro no servidor de produção, não é um módulo comumente instalado e você precisará de algum controle do ambiente de produção para fazer isso.Por outro lado, uma solução simples é ter várias versões de seus virtualhosts dependendo do ambiente, e adicionar alguns comentários na seção Auth.Mas se você está procurando uma solução genérica, certamente significa que é um problema recorrente e deseja evitar a edição manual de arquivos, nesses casos o mod_macro pode se tornar uma forma muito profissional de capitalizar suas experiências com o apache, até que suas configurações do apache se tornem uma única macro com parâmetros, chamando muitas outras macros.

Condicionais na configuração do Apache funcionam apenas uma vez, quando a configuração é [re]carregada.

O que eu faria é criar um segundo VirtualHost com o mesmo diretório raiz e controlar o acesso usando Negar/Permitir com base no endereço IP.

Adicione o seguinte:

Require valid-user
Allow from <dev IP>
Satisfy Any

Isso exigirá que Require valid-user ou Allow from <dev IP> se aplica.

Na tua .htaccess arquivo você pode aninhar os blocos dentro da diretiva IfDefine, como:

<IfDefine PROD>
  bla bla bla
</IfDefine>

Então certifique-se de passar -D PROD como argumento quando você inicia o Apache.Esta seção só seria executada se PROD estivesse definido.No Ubuntu você pode fazer isso, por exemplo, editando /etc/apache2/envvars e adicionando esta linha no final:

export APACHE_ARGUMENTS="-D PROD"

Você pode "inverter" talvez usando algo como <IfDefine !DEV> para executar apenas quando não for o ambiente de desenvolvimento e, em seguida, passar -D DEV nesse ambiente e deixar os sites de produção como estão, sem precisar editar os envvars.

Modifique de acordo com suas necessidades!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top