Arkadiusz Burszczan

Arkadiusz Burszczan Programista Java

Temat: Sesja ginie

Witam, Mam otóż taki problem z sesją w projekcie. Mianowicie mam w boostrapie _initSession(), i wszystko działa poprawnie, jak w url nie nie wpisze np http://localhost/archii/thesis/editthesis/id/28, wtedy sesja ginie mi i nie mam pojęcia dlaczego?? Jeśli w url jest tylko nazwa controllera/ nazwa akcji to wszystko działa poprawnie. Problem pojawił się, gdy do boostrapa wstawiłem plugin z ACL.

Boostrap wygląda tak:

protected function _initSession()
{
$config = new Zend_Config_Ini(APPLICATION_PATH.'/config.ini', 'general');`
Zend_Session::start();
Zend_Session::rememberMe($config->sessionTime);
require_once 'Zend/Session/Namespace.php';
$auth = new Zend_Session_Namespace('zalogowane');
}
protected function _initPlugin()
{
$frontController = Zend_Controller_Front::getInstance();
// acl require_once('Plugin/MojeAcl.php');
$acl=new MojeAcl();
$auth = new Zend_Session_Namespace('zalogowane');
// sprawdzamy role
require_once('Plugin/AutentykacjaRoli.php');
$plugin=new AutentykacjaRoli($auth,$acl);
$frontController->registerPlugin($plugin);
}
Arkadiusz Burszczan edytował(a) ten post dnia 10.04.11 o godzinie 23:48Arkadiusz Burszczan edytował(a) ten post dnia 10.04.11 o godzinie 23:49

konto usunięte

Temat: Sesja ginie

Witam,

szczerze mówiąc chyba za mało kodu podałeś by coś stwierdzić na pewno. Zwróć uwagę na wywołanie Zend_Session::rememberMe(), w dokumentacji opisującej tą funkcje jest takie zdanie "Use Zend_Session::rememberMe() before a session is started to control the length of time before a persisted session cookie expires." Zamień kolejność wywołania Zend_Session::start(), Zend_Session::rememberMe(). To nie rozwiąże twojego problemu, ale funkcja rememberMe() zacznie działać.

Nie do końca wiadomo do czego przypisujesz tego Namespac'a [$auth = new Zend_Session_Namespace('zalogowane');], co to jest ta zmienna $auth? Brakuje kodu.

No i jeżeli mówisz że przy włączeniu pluginu sesja nie działa, to pasuje dołączyć kod pluginu.

Pozdrawiam
Arkadiusz Burszczan

Arkadiusz Burszczan Programista Java

Temat: Sesja ginie

Plugin, który sprawdza uprawnienia i sesję.

class AutentykacjaRoli extends Zend_Controller_Plugin_Abstract
{
private $auth;
private $acl;

private $noauth = array(
'controller' => 'index',
'action' => 'logowanie');

private $noacl = array(
'controller' => 'error',
'action' => 'error');

public function __construct($auth, $acl)
{
$this->auth = $auth;
$this->acl = $acl;
}

/**
* co znaczy predispatch
* akcja wywolywana przed dyspozytorem czyli przed dodaniem kontrolera do dyspozytora
* natomiasdt postdispatch mamy juz po dodaniu do dyspozytora
*
* @param unknown_type $request
*/
public function dispatchLoopStartup($request)
{
/*
* sprawdzamy czy jest zalogowany jesli jest to ma jakas role
* jesli nie dostaje role gosc
*/
if ($this->auth->__isset('user')) {
$role = $this->auth->__get('rola');
} else {
$role = 'obcy';
}
//Zend_Debug::dump($role, $label=null, $echo=true);
/*
* pobieramy obecne wywolanie czyli jaka akcje i jaki kontroler mamy wlaczony
*/
$controller = $request->controller;
$action = $request->action;
/*
* sprawdzamy czy w acl jest taki zasob
* jesli nie ma to wychodzimy z pluginu poniewaz ten zasob nie jest uwgledniony
* i jest prawdopodobnie bledny
* akcje przejmie wtedy error_helper
*/


if (!$this->acl->has($controller))
{
return;
}
/**
* sprawdzamy, czy stienie w acl taki zasob,
* czy ma uprawnienia do danego zasobu w acl
* czy istnieje sesja
*
*/
if ($this->acl->has($controller) && $this->acl->isAllowed($role,null,$controller) && $this->auth->__isset('user'))
{
$request->setControllerName($controller);
$request->setActionName($action);

}
else
// sprawdzamy czy uzytkownik nie ma prawa do zasobu ktory wywolujemy
if (!$this->acl->isAllowed($role,null,$controller) ) {
//jesli nie ma prawa sprawdzmy czy jest zalogowany
//jesli nie jest to na stronbe logowania przenosimy
if (!$this->auth->__isset('user')) {
$controller = $this->noauth['controller'];
$action = $this->noauth['action'];
}
else
{
$request->setControllerName('error');
$request->setActionName('permission'); }

$request->setControllerName($controller);
$request->setActionName($action);
}

$dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
if (!$dispatcher->isDispatchable($request))
{
$request->setControllerName('error');
$request->setActionName('error');
}

}

}

konto usunięte

Temat: Sesja ginie

Witam,

szczerze mówiąc nie znalazłem w kodzie miejsca gdzie by mogła sesja być utracona.

Z tego co się domyślam, przy autoryzacji wyciągasz obiekt z bazy i ładujesz do do sesji "Zend_Session_Namespace('zalogowane')". Może tam problem jakiś.
Pokaż, może, autoryzacje.Yuriy Kisil edytował(a) ten post dnia 11.04.11 o godzinie 15:41Yuriy Kisil edytował(a) ten post dnia 11.04.11 o godzinie 15:42
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: Sesja ginie

A jak wygląda plugin MojeAcl()?
Arkadiusz Burszczan

Arkadiusz Burszczan Programista Java

Temat: Sesja ginie

Wstępny Plugin MojeAcl()

<?php
class MojeAcl extends Zend_Acl
{
public function __construct()
{
/**
* dodawanie rol
* dla uzytkownik├│w
*
* @param student,pracownik,administrator
*
*/
$this->addRole(new Zend_Acl_Role('obcy'))
->addRole(new Zend_Acl_Role('student'))
->addRole(new Zend_Acl_Role('pracownik'))
->addRole(new Zend_Acl_Role('administrator'));


/** Creating resources */
require_once 'Zend/Acl/Resource.php';
$this->add(new Zend_Acl_Resource('index'))
->add(new Zend_Acl_Resource('admin'))
->add(new Zend_Acl_Resource('rejestracja'))
->add(new Zend_Acl_Resource('error'))
->add(new Zend_Acl_Resource('thesis'));
$this->allow('obcy',null,array('index','rejestracja'));
$this->allow('student',null,array('index','rejestracja','thesis'));
$this->allow('pracownik',null,array('index','rejestracja','thesis'));
$this->allow('administrator',null,array('index','admin','rejestracja','thesis'));
// echo $this->isAllowed('administrator', null, 'admin') ? "allowed" : "denied";
}
}
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: Sesja ginie

Arkadiusz Burszczan:
http://localhost/archii/thesis/editthesis/id/28, wtedy sesja ginie mi i nie mam pojęcia dlaczego?? Jeśli w url jest tylko nazwa controllera/ nazwa akcji to wszystko działa poprawnie.

Z kodu ACLa też nie wynika żeby gdzieś ginęła sesja. To jeszcze zobacz tak: co się dziej jeśli
- wyłączony plugin, wchodzisz na adres http://localhost/archii/thesis/editthesis/id/28
- wyłączony plugin, wchodzisz na adres z kontrolerem i akcją
- włączony plugin, wchodzisz na adres http://localhost/archii/thesis/editthesis/id/28
- włączony plugin, wchodzisz na adres z kontrolerem i akcją

Nie ustawiasz czegoś z sesją w danym kontrolerze/akcji?

Jeszcze pamiętam jak kiedyś w początkach ZF korzystałem z ustawienia remember_me_seconds w config.ini to sesja potrafiła się gubić. Pomagało wywołanie Zend_Session::regenerateId(). Rozwiązanie naokoło, ale wtedy pomogło i nie szukałem dalszych przyczyn.
Arkadiusz Burszczan

Arkadiusz Burszczan Programista Java

Temat: Sesja ginie

Problem jest w Zend_Session::remmberMe();
Jak tę linijkę zakomentuje to mi wszystko ładnie działa, a jak tego używam to mi sesję gubi...

konto usunięte

Temat: Sesja ginie

Z tego jak pamiętam Zend_Session::remmberMe(); powodowało wygenerowanie nowego session id. Jeżeli wrzuciłeś rememberMe() do bootstrapa to jest ona wykonywana za każdym odświeżeniem strony, a co za tym idzie -> za każdym razem przegenerowany jest id sesji i metoda read z Zend_Session nie odczytuje danych z sesji, bo taki obiekt najprawdopodobniej nie istniej i w metodzie write jest tworzona nowa sesja. Zajrzyj do folderu gdzie Twój "server" trzyma sesje, czy nie są tworzone za każdym razem nowe pliki (o ile trzymasz dane w standardowej sesji "servera", a jak w bazie, to zapewne tworzony jest nowy rekord). Ja poradziłem sobie z tym w ten sposób, że metodę rememberMe() wywołałem tylko raz, po poprawnej autoryzacji użytkownika - logowaniu.Łukasz Ciołecki edytował(a) ten post dnia 17.04.11 o godzinie 15:37



Wyślij zaproszenie do