W swoim frameworku posiadam coś co działa na zasadzie intercepting filter, czyli wszystkie filtry dodane są odpalane przed wykonywaniem akcji (routeStartup), po ich wykonaniu(routeShutdown) oraz w czasie ich wykonywania(preDispath oraz PostDispatch), coś na wzór ZF.
Mam także klase uprawnien która sprawdza czy użytkonika ma dostęp do akcji. I tu jest problem z gubieniem sesji. Klasa sprawdza uprawnienia na tekiej zasadzie:
<?php class Apos_Plugins_Access extends Apos_Controller_Plugin_Abstract { public function preDispath(Apos_Controller_Token $aToken) // wykonywane przed każdą akcją łącznie z tymi forwardowanymi { $aFile = CONFIG_DIR . $aToken->getController() . '.php'; return $aToken; $aConfig = new Apos_Auth_Details($aFile, $aToken); // parsowanie pliku konfigu if($aConfig->isPublic()) // jeśli jest publiczna zwraca Token return $aToken; // Start checking user privilages ... $aGroups = new Apos_Auth_Groups; $aUser = new Apos_Auth_User; $authorization = new Apos_Auth_Authorization; $auth = $authorization->restoreUser(); if($aConfig->has('Secure')) { if(!$auth) return $aConfig->getNextToken(); } if($aConfig->has('Allow')) { throw new AposException('Allow parameter must be array'); if(!$aGroups->allow($aConfig->get('Allow'), $aUser)) return $aConfig->getNextToken(); } if($aConfig->has('Deny')) { throw new AposException('Deny parameter must be array'); if(!$aGroups->deny($aConfig->get('Deny'), $aUser)) return $aConfig->getNextToken(); } return $aToken; } } ?>
Filtr ten dodaje w pliku głownym index.php:
<?php // session_start(); i wszystko ok require_once(APOS_DIR . 'apos/Apos.php'); try { $PluginMenager = PluginMenager::getInstance(); $context = new Apos_Context_HttpContext(new Apos_Context_HttpRequest(), new Apos_Context_HttpResponse()); $PluginMenager->add($context, 'HttpContext'); $Front = new Apos_Controller_Front(); $Front->registerPlugin(new Apos_Plugins_Benchmark); $Front->registerPlugin(new Apos_Plugins_Access); // dodanie klasy uprawnien $PluginMenager->add($Front, 'Front'); $Front->execute(); $context->flush(); } catch(PdoException $e) { } catch(AposException $e) { } ?>
No i gdy user sie zaloguje są zapisywane jego dane w sesji. Ale gdy już wejde na inną akcje (strone) to sesja sie gubi. Problem ten rozwiązało dodanie session_start() na początku pliku index ale to brzydkie rozwiązanie, bo jeśli nie ma filtru uprawnien to session_start nie powinno być wykonywane. Więc chciałem dodac do klasu uprawnien RouteStartup:
<?php class Apos_Plugins_Access extends Apos_Controller_Plugin_Abstract { public function routeStartup() { } }?>
ale mimo tego że session_start() jest przed wykonywaniem akcji, sesja nadal sie gubi :/
Co może być tego przyczyną :?:
Pozdrawiam