Prérequis: L’activation du plugin sfDoctrineGuardPlugin
Dans le cadre d’un développement, je cherchais à passer à mon application en mode maintenance pour un utilisateur normal mais que le super admin puisse continuer à visualiser les pages du site. La tâche symfony n’est pas satisfaisante dans ce cas car elle verrouille complètement l’accès à celui-ci. Voici donc ma solution:
Premièrement, j’ai activé le paramètre check_lock dans le fichier settings.yml de mon application.
Path: /apps/[NomApp]/config/settings.yml
all: .settings: check_lock: on
Pour stocker mon fichier de verrouillage, j’ai créé un dossier « lock » dans le dossier data
mkdir data/lock
Attention: ce dossier doit être en écriture
J’ai ensuite inséré le code suivant dans ProjectConfiguration
Path: /config/ProjectConfiguration.class.php
class ProjectConfiguration extends sfProjectConfiguration { public function setup() { ... } public function getApplicationLockFile() { return sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR. 'lock'.DIRECTORY_SEPARATOR.$this->getApplication().'.lck'; } }
Vient maintenant la partie contrôle de l’accès. Pour cela j’ai créé un filtre que voici
Path: /lib/isApplicationActivatedFilter.class.php
class isApplicationActivatedFilter extends sfFilter { public function execute ($filterChain) { if ($this->isFirstCall()) { if (sfConfig::get('sf_check_lock')) { $context = $this->getContext(); $config = $context->getConfiguration(); $user = $context->getUser(); $fileLock = $config->getApplicationLockFile(); if (file_exists($fileLock) && !$user->isSuperAdmin()) { $files = array( sfConfig::get('sf_app_config_dir').'/unavailable.php', sfConfig::get('sf_config_dir').'/unavailable.php', sfConfig::get('sf_web_dir').'/errors/unavailable.php', sfConfig::get('sf_symfony_lib_dir').'/exception/data/unavailable.php', ); foreach ($files as $file) { if (is_readable($file)) { include $file; break; } } die(1); } } } $filterChain->execute(); } }
Il reste maintenant à charger ce filtre dans notre application
Path: /apps/[NomApp]/config/filters.yml
rendering: ~ security: ~ # insert your own filters here isApplicationActivated: class: isApplicationActivatedFilter cache: ~ common: ~ execution: ~
Il faut suffit maintenant de personnaliser votre page de maintenance en créant le fichier unavailable.php dans votre dossier config.
Dès à présent, si vous créer un fichier [NomApp].lck dans le dossier lock, votre application passera en mode maintenance.
Dans cette article, je ne détaille pas la création et la suppression de ce fichier lck. Je vous laisse le soin de le faire avec votre propre gestion.
Pour tester le bon fonctionnement de ce procédé, vous pouvez créer deux comptes dans votre base de données:
- Compte admin avec le flag is_super_admin: true
- Compte user sans le flag is_super_admin
Vous vous identifiez avec le compte admin et ensuite vous créer le fichier [NomApp].lck dans votre dossier lock et vous vous rendez compte que vous avez toujours accès au page de votre site. Si vous répétez la chose avec le compte user, vous verrez apparaître la page de maintenance.
J’espère que ce code vous servira dans votre prochain développement.
Bonne découverte.
Bonjour,
Très bonne idée en effet.
Voici une solution alternative, si c’est uniquement une coupure du site pouvant être initiée par un développeur.
C’est à mettre dans le .htaccess (après le RewriteBase de Symfony) pour renvoyer vers une page maintenance.html sauf pour certaines IP :
RewriteCond %{REMOTE_ADDR} !192\.168\.0\.1
RewriteCond %{REMOTE_ADDR} !127\.0\.0\.1
RewriteCond %{REMOTE_ADDR} !4\.5\.6\.7
RewriteRule .* maintenance.html [QSA,L]