Moduły w ZF2 a ograniczenie dostępu do nich per domena dla aplikacji

Dzisiejsza zagwostka programistyczno-konfiguracyjna ma genezę w dobrodziejstwie i elastyczności jakie niesie za sobą nowa wersja framework-a Zend (ZF2). Otóż to co w wersji 1.x było nieużywalnym i nieskalowalnym klocem – czyli moduły – stało się lekkim łatwym i przyjemnym elementem w wersji 2, który to jednakoż wpędził nas w małe kłopoty :)

Otóż, wiedzeni magią nowego otwarcia ZF2 (a wspomnieć należy, że ZF i ZF2 to dwa tak różne światy, że bardziej różne być nie mogę) zrobiliśmy trzy moduły. Przy okazji korzystając z dobrodziejstwa konfiguracji router-a każdy moduł odpowiadał w hoście na innej subdomenie (o jakże cudownie – nie tylko nie trzeba robić trzech aplikacji, ale można współdzielić zasoby, np. modele w ramach jednej i nie trzeba już w tym celu łapać się prawą stopą za lewe ucho).

Problemy zaczęły się gdy pojawiło się wymaganie aby dwie z trzech prowadzących do vhosta domen ograniczyć do wybranych adresów IP, trzecia zaś powinna zgłaszać się bez restrykcji (sytuacja dość właściwie życiowa gdy jedną z aplikacji jest ogólnodostępny front systemu a dwie pozostałe służą do zarządzania lub innych czynności wykonywanych tylko z IP firmy).

Problem do tej pory nigdy nas nie dotknął ponieważ w takich przypadkach zawsze były oddzielne hosty i konfigurację można było swobodnie prowadzić w obrębie każdego z nich. Dla opisywanego problemu apache przewidział jednak bardzo miłe rozwiązanie (do zastosowania w definicji vhost-ów lub nawet bezpośrednio w .htaccess):

<Limit GET POST>
SetEnvIf HOST "^subdomena-cms.nasza-domena.pl" cms_url
SetEnvIf HOST "^subdomena-cms2.nasza-domena.pl" cms2_url
SetEnvIf HOST "^subdomena-publiczna.nasza-domena.pl" public_url

order deny,allow
deny from all

Allow from 193.33.5.57
Allow from 46.28.247..89
Allow from env=public_url

Satisfy Any
</Limit>

Klucze są tu dwa. Pierwszym jest system ustawiania zmiennych środowiskowych dla przychodzących requestów: mod_setenvif oraz bardzo przyjemna i mało znana dyrektywa Satisfy Any.

W skrócie powyższy kod możne być zinterpretowany jako:

  • Jeśli wchodzisz z domeny (x, y, z) ustaw mi odpowiednią zmienną (x1, y1, z1)
  • Generalnie wysyłaj wszystkich na drzewo – ewentualnie pozwalaj jeśli:
  • Ktoś wchodzi z IP1, IP2 lub ktoś się dobiera do domeny publicznej