Reading time: 7 – 12 minutes
A l’article symfony: entorns de desenvolupament, integració i producció es pot entendre el perquè de treballar amb aquests tres espais de noms (environment) així doncs el que es preten explicar és:
- Impedir accés a les aplicacions en entorns de ‘dev’ i ‘int’ des de llocs no controlats. O sigui, que una IP d’internet no pugui executar myapp_dev.php o myapp_int.php però encanvi una IP de la xarxa del desenvolupador si que pugui.
- Impedir accés a aplicacions de backend des de l’entorn de producció. Si hem desenvolupat alguna aplicació per tal de fer el manteniment de l’aplicació principal, una part d’administració o backend aquesta no sigui accessible des d’IPs no controlades.
- Separar el fitxer de configuració config/cofnig.php per cada un dels entorns. Així podem definir constants o d’altres tasques de forma particular per cada un dels entorns.
Per tal d’aconseguir aquests objectius he creat el fitxer config/config.lib.php:
<?php
/**
* Comproba si la IP amb la que s'accedeix a l'aplicació permet connectar en aquest environment
*
* @param string $env nom de l'environment
* @param array $ips ips des de les que podem accedir a l'environment
* @param string $clientip ip del client que vol accedir al recurs
*/
function envCorrecte ($env,$ips,$clientip)
{
if (SF_ENVIRONMENT==$env)
{
$acces=0;
foreach($ips as $ip)
{
$ipclient=substr($clientip,0,strlen($ip));
if ($ipclient==$ip)
{
$acces=1;
}
}
if ($acces==0)
{
echo "You are not in '".$env."' environment! (".$ipclient."<>".$ip.")";
exit;
}
}
}
/**
* Comproba si l'aplicació amb la que s'accedeix al projecte és publica o no
*
* @param array $apps llista d'aplicacions no públiques
* @param array $ips llista d'IP amb les que es pot accedir a les apps no públiques
* @param string $clientip ip del client que vol accedir al recurs
*/
function appCorrecte ($apps,$ips,$clientip)
{
// solucionem problema de la clau '0'
$apps_aux[0]='';
$apps = $apps_aux + $apps;
//
if (array_search(SF_APP,$apps)!=false)
{
$acces=0;
foreach($ips as $ip)
{
$ADR=$HTTP_SERVER_VARS['REMOTE_ADDR'];
$ipclient=substr($clientip,0,strlen($ip));
if ($ipclient==$ip)
{
$acces=1;
}
}
if ($acces==0)
{
echo "Keep away! ".SF_APP." is not a public application!";
exit;
}
}
}
?>
Llavors des del fitxer config/config.php cal que cridem aquesta petita llibreria de funcions que he creat. La resta és més que lògica, aquí en teniu un exemple:
<?php
include("config.lib.php");
/**
* Controlem accés als 'environments' de 'env' i 'int'
*/
$ip_dev=array("10.138.0.","192.168.");
$ip_int=array("10.138.0.","192.168.");
envCorrecte('env',$ip_env,$HTTP_SERVER_VARS['REMOTE_ADDR']);
envCorrecte('int',$ip_int,$HTTP_SERVER_VARS['REMOTE_ADDR']);
/**
* Controlem accés a les 'apps' d'ús privat
*/
$ip_apps=array("10.138.0.","192.168.","w.x.y.z");
$apps=array('myapp_1','myapp_2','myapp_n');
appCorrecte($apps,$ip_apps,$HTTP_SERVER_VARS['REMOTE_ADDR']);
/**
* Carreguem el fitxer de configuració propi de l'"environment".
*/
include("config.".SF_ENVIRONMENT.".php");
/**
* Part comú en els 3 entorns
*/
?>
Com podeu veure el codi és molt senzill i la potència i el dinamisme, excepcionals.
Aquest codi també l’he publicat com un snippet a Access control to environment and applications and custom global config file for an environment.