2010-07-26 17 views
7

Mam konfigurację uwierzytelniania htpasswd na mojej witrynie na żywo i działa świetnie, ale nie chcę być proszony o podanie hasła podczas pracy nad środowiskiem programistycznym.htaccess conditionals

W moim pliku httpd.conf mam:

SetEnv APP_ENV "development" 

W moim pliku .htaccess mam:

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

Zastanawiałem się, czy nie było w każdym razie oddania warunkowa wokół rzeczy htppasswd tak że gdy APP_ENV jest development, nie otrzymuję pytania o hasło.

Czy to możliwe?

Odpowiedz

6

Jeśli jesteś w stanie, powinieneś pomyśleć o uaktualnieniu do wersji Apache 2.4 (lub najnowszej wersji beta wersji 2.3, ponieważ wersja 2.4 nie została jeszcze wydana).

Jedną z nowych dostępnych funkcji jest Authorization Containers - co znacznie upraszcza definiowanie wymagań dostępu przy użyciu dyrektywy Require.

Należy skończyć z czymś takim:

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> 
2

Ustawienia warunkowe w konfiguracji Apache działają tylko raz, gdy konfiguracja jest [ponownie załadowana].

Co mogę zrobić, to utworzyć drugi VirtualHost z tym samym katalogiem głównym i kontrolować dostęp za pomocą Deny/Allow w oparciu o adres IP tam.

2

Dodaj następujący:

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

To będzie wymagać Require valid-userlubAllow from <dev IP> dotyczy.

+0

To by działało, ale muszę użyć "Satisfy All" z powodu innych ograniczeń. – gpojd

+0

@gpojd Czy mógłbyś opublikować całą konfigurację? – zrvan

+0

Niestety, nie mogę tego opublikować. Mój .htaccess jest podobny do OP, ale ograniczam go także poprzez adres IP i mam "Satisfy All". – gpojd

3

Jednym ze sposobów budowania, jeśli bloki warunkowe ze zmiennymi env używają modułu mod_macro. Zrobiłem przykład wcześniej here.

W tym konkretnym przypadku trzeba na początku pliku wirtualnego hosta (przed definicji wirtualnego hosta):

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

i wewnątrz virtualhost:

Use ConditionalBlockMacroSecurity_${APP_ENV} 

gdzie ścieżka do pliku htpassword mógł również ustawić jako parametr makra.

Wadą tego rozwiązania jest to, że musisz zainstalować mod_macro na serwerze produkcyjnym, to nie jest powszechnie zainstalowany moduł i będziesz potrzebował pewnej kontroli środowiska produkcyjnego, aby to zrobić. Z drugiej strony prostym rozwiązaniem jest posiadanie kilku wersji wirtualnych hostów w zależności od środowiska i dodawanie komentarzy w sekcji Auth. Ale jeśli szukasz ogólnego rozwiązania, oznacza to, że jest to problem recoleśny i chcesz uniknąć ręcznej edycji plików, w takich przypadkach mod_macro może stać się bardzo profesjonalnym sposobem kapitalizacji doświadczeń z Apache, dopóki konfiguracje Apache nie staną się pojedynczym makrem. z parametrami, wywołując wiele innych makr.

0

W pliku .htaccess można zagnieździć bloki w dyrektywie IfDefine, takie jak:

<IfDefine PROD> 
    bla bla bla 
</IfDefine> 

Następnie upewnij się, aby przejść -D PROD jako argument kiedy uruchamiasz Apache. Ta sekcja byłaby uruchomiona tylko wtedy, gdy zdefiniowano PROD. W Ubuntu można to zrobić na przykład edytując /etc/apache2/envvars i dodając tę ​​linię na końcu:

export APACHE_ARGUMENTS="-D PROD" 

można „odwrotną” to przez może za pomocą czegoś podobnego <IfDefine !DEV> uruchomić tylko wtedy, gdy jej nie środowisko programistyczne, a następnie przekazać -D DEV w tym środowisku i opuścić zakłady produkcyjne bez konieczności edycji envvars.

Zmień odpowiednio do swoich potrzeb!