Question

J'ai configuré l'authentification htpasswd sur mon site en direct et cela fonctionne très bien, mais je ne veux pas qu'on me demande un mot de passe lorsque je travaille sur l'environnement de développement.

Dans mon fichier httpd.conf j'ai :

SetEnv APP_ENV "development"

Dans mon .htaccess fichier que j'ai :

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

Je me demandais s'il était possible de mettre un conditionnel autour du truc htppasswd pour que lorsque APP_ENV est development que je ne reçois pas de mot de passe.

Est-ce possible?

Était-ce utile?

La solution

Si vous en êtes capable, vous devriez penser à passer à Apache2.4 (ou la dernière version bêta 2.3 puisque la version 2.4 n'est pas encore tout à fait publiée).

L'une des nouvelles fonctionnalités disponibles est Conteneurs d'autorisation - rendant beaucoup plus simple la définition des exigences d'accès à l'aide du Exiger directif.

Vous devriez obtenir quelque chose comme :

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>

Autres conseils

L'une des façons de construire des blocs conditionnels avec des variables d'environnement consiste à utiliser mod_macro module.J'ai fait un exemple précédemment ici.

Dans ce cas particulier, vous auriez en haut du fichier VirtualHost (avant la définition 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>

Et à l'intérieur du Virtualhost :

Use ConditionalBlockMacroSecurity_${APP_ENV}

où le chemin d'accès au fichier htpassword peut également être défini comme paramètre de la macro.

L'inconvénient de cette solution est que vous devez installer mod_macro sur le serveur de production, ce n'est pas un module couramment installé et vous aurez besoin d'un certain contrôle sur l'environnement de production pour ce faire.D'un autre côté, une solution simple est d'avoir plusieurs versions de vos hôtes virtuels en fonction de l'environnement, et d'ajouter quelques commentaires sur la section Auth.Mais si vous recherchez une solution générique, cela signifie certainement que c'est un problème récurrent et que vous souhaitez éviter l'édition manuelle des fichiers. Dans de tels cas, mod_macro peut devenir un moyen très professionnel de capitaliser vos expériences Apache, jusqu'à ce que vos configurations Apache deviennent une seule macro. avec des paramètres, appelant beaucoup d'autres macros.

Les conditions dans la configuration Apache ne fonctionnent qu'une seule fois, lorsque la configuration est [re]chargée.

Ce que je ferais, c'est créer un deuxième VirtualHost avec le même répertoire racine et contrôler l'accès en utilisant Deny/Allow en fonction de l'adresse IP.

Ajoutez ce qui suit :

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

Cela nécessitera que Require valid-user ou Allow from <dev IP> s'applique.

Dans ton .htaccess fichier, vous pouvez imbriquer les blocs dans la directive IfDefine, comme :

<IfDefine PROD>
  bla bla bla
</IfDefine>

Alors assurez-vous de réussir -D PROD comme argument lorsque vous démarrez Apache.Cette section ne s'exécuterait que si PROD est défini.Dans Ubuntu, vous pouvez le faire, par exemple, en éditant /etc/apache2/envvars et en ajoutant cette ligne à la fin :

export APACHE_ARGUMENTS="-D PROD"

Vous pouvez "l'inverser" en utilisant peut-être quelque chose comme <IfDefine !DEV> pour s'exécuter uniquement lorsque ce n'est pas l'environnement de développement, puis passer -D DEV dans cet environnement et laisser les sites de production tels quels sans avoir à modifier les variables d'environnement.

Modifiez en conséquence selon vos besoins !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top