Witam

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:

  1. <?php
  2.  
  3. class Apos_Plugins_Access extends Apos_Controller_Plugin_Abstract {
  4.  
  5. public function preDispath(Apos_Controller_Token $aToken) // wykonywane przed każdą akcją łącznie z tymi forwardowanymi
  6. {
  7. $aFile = CONFIG_DIR . $aToken->getController() . '.php';
  8.  
  9. if(!is_readable($aFile)) // jeśli kontroler nie ma konfigu akcja jest dostępna oraz publiczna
  10. return $aToken;
  11.  
  12. $aConfig = new Apos_Auth_Details($aFile, $aToken); // parsowanie pliku konfigu
  13.  
  14. if($aConfig->isPublic()) // jeśli jest publiczna zwraca Token
  15. return $aToken;
  16.  
  17. // Start checking user privilages ...
  18.  
  19. $aGroups = new Apos_Auth_Groups;
  20. $aUser = new Apos_Auth_User;
  21. $authorization = new Apos_Auth_Authorization;
  22. $auth = $authorization->restoreUser();
  23.  
  24. if($aConfig->has('Secure'))
  25. {
  26. if(!$auth)
  27. return $aConfig->getNextToken();
  28. }
  29.  
  30. if($aConfig->has('Allow'))
  31. {
  32. if(!is_array($aConfig->get('Allow')))
  33. throw new AposException('Allow parameter must be array');
  34.  
  35. if(!$aGroups->allow($aConfig->get('Allow'), $aUser))
  36. return $aConfig->getNextToken();
  37. }
  38.  
  39. if($aConfig->has('Deny'))
  40. {
  41. if(!is_array($aConfig->get('Deny')))
  42. throw new AposException('Deny parameter must be array');
  43.  
  44. if(!$aGroups->deny($aConfig->get('Deny'), $aUser))
  45. return $aConfig->getNextToken();
  46. }
  47.  
  48. return $aToken;
  49. }
  50. }
  51.  
  52. ?>


Filtr ten dodaje w pliku głownym index.php:

  1. <?php
  2. // session_start(); i wszystko ok
  3. define('APOS_DIR', dirname(__FILE__).'/');
  4.  
  5. require_once(APOS_DIR . 'apos/Apos.php');
  6.  
  7. try
  8. {
  9. $PluginMenager = PluginMenager::getInstance();
  10.  
  11. $context = new Apos_Context_HttpContext(new Apos_Context_HttpRequest(), new Apos_Context_HttpResponse());
  12. $PluginMenager->add($context, 'HttpContext');
  13.  
  14. $Front = new Apos_Controller_Front();
  15. $Front->registerPlugin(new Apos_Plugins_Benchmark);
  16. $Front->registerPlugin(new Apos_Plugins_Access); // dodanie klasy uprawnien
  17.  
  18. $PluginMenager->add($Front, 'Front');
  19.  
  20. $Front->execute();
  21.  
  22. $context->flush();
  23.  }
  24.  catch(PdoException $e) {
  25. echo $e->getMessage();
  26.  } catch(AposException $e) {
  27. echo $e->getMessage();
  28. }
  29.  
  30. ?>


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:

  1. <?php
  2. class Apos_Plugins_Access extends Apos_Controller_Plugin_Abstract {
  3.  
  4. public function routeStartup()
  5. {
  6. session_start(); // lub Apos_Session::start();
  7. }
  8. }?>


ale mimo tego że session_start() jest przed wykonywaniem akcji, sesja nadal sie gubi :/
Co może być tego przyczyną :?:

Pozdrawiam