Pregunta

Configuré la autenticación htpasswd en mi sitio en vivo y funciona muy bien, pero no quiero que me pidan una contraseña cuando estoy trabajando en el entorno de desarrollo.

En mi archivo httpd.conf tengo:

SetEnv APP_ENV "development"

En mi .htaccess archivo que tengo:

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

Me preguntaba si había alguna forma de poner un condicional alrededor de htppasswd para que cuando APP_ENV es development que no me piden una contraseña.

es posible?

¿Fue útil?

Solución

Si puede, debería pensar en actualizar a Apache 2.4 (o la última versión beta 2.3 ya que la 2.4 aún no se ha lanzado).

Una de las nuevas funciones disponibles es Contenedores de autorización - haciendo que sea mucho más sencillo definir los requisitos de acceso utilizando el Requerir directiva.

Deberías terminar con 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>

Otros consejos

Una de las formas de construir bloques condicionales if con variables env es usar mod_macro módulo.Hice un ejemplo anteriormente aquí.

En este caso particular, tendría encima del archivo VirtualHost (antes de la definición de 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>

Y dentro del Virtualhost:

Use ConditionalBlockMacroSecurity_${APP_ENV}

donde la ruta al archivo htpassword también podría establecerse como parámetro de la macro.

La desventaja de esta solución es que necesita instalar mod_macro en el servidor de producción, no es un módulo instalado comúnmente y necesitará cierto control del entorno de producción para hacerlo.Por otro lado, una solución sencilla es tener varias versiones de sus servidores virtuales dependiendo del entorno y agregar algunos comentarios en la sección Auth.Pero si está buscando una solución genérica, ciertamente significa que es un problema recurrente y desea evitar la edición manual de archivos, en tales casos mod_macro puede convertirse en una forma muy profesional de capitalizar sus experiencias con Apache, hasta que sus configuraciones de Apache se conviertan en una única macro. con parámetros, llamando a muchas otras macros.

Los condicionales en la configuración de Apache funcionan solo una vez, cuando se [re]carga la configuración.

Lo que haría es crear un segundo VirtualHost con el mismo directorio raíz y controlar el acceso usando Denegar/Permitir según la dirección IP allí.

Agregue lo siguiente:

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

Esto requerirá que Require valid-user o Allow from <dev IP> aplica.

En tus .htaccess archivo puede anidar los bloques dentro de la directiva IfDefine, como:

<IfDefine PROD>
  bla bla bla
</IfDefine>

Entonces asegúrate de pasar -D PROD como argumento cuando inicias apache.Esta sección solo se ejecutará si se define PROD.En Ubuntu puedes hacer esto, por ejemplo, editando /etc/apache2/envvars y añadiendo esta línea al final:

export APACHE_ARGUMENTS="-D PROD"

Puedes "invertirlo" quizás usando algo como <IfDefine !DEV> ejecutar solo cuando no sea el entorno de desarrollo, y luego pasar -D DEV en ese entorno y dejar los sitios de producción como están sin tener que editar envvars.

¡Modifique en consecuencia para satisfacer sus necesidades!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top