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:
<?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';
if(!is_readable($aFile)) // jeśli kontroler nie ma konfigu akcja jest dostępna oraz publiczna 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
Ten post edytował Apo 30.09.2006, 15:34:36