Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Po sprawdzeniu dostepu wylogowywuje
Forum PHP.pl > Forum > PHP > Frameworki
quality
Witam.

mam problem z Zend_Auth.

Standardowo mam logowanie i autoryzacje umieszczona w pluginie, wszystko dziala ladnie, do czasu...

W widoku mam link "dodaj artykuł". Chciałem zrobić tak, że jesli uzytkownik jest zalogowany to wyswietla link do formularza, a jesli nie to ten link zamienia sie w link do logowania.

Napisalem sobie do tego helpera, ktory zwraca mi prawde jesli uzytkownik ma dostep do dodawania artykolu:
  1. class Zend_View_Helper_IsAllowedAction {
  2.  
  3. protected $_controller;
  4.  
  5. public function __construct() {
  6. $front = Zend_Controller_Front::getInstance();
  7. $request = $front->getRequest();
  8. $controller = $request->getControllerName();
  9.  
  10. $this->_controller = $controller;
  11. }
  12.  
  13. public function isAllowedAction($action, $controller = false)
  14. {
  15.  
  16. if($controller){
  17. $setController = $controller;
  18. } else {
  19. $setController = $this->_controller;
  20. }
  21.  
  22. $registry = Zend_Registry::getInstance();
  23. $acl =$registry->get('acl');
  24.  
  25. $auth = Zend_Auth::getInstance();
  26. if($auth->hasIdentity())
  27. {
  28. $role = $auth->getIdentity()->value;
  29. } else {
  30. $role = '1';
  31. }
  32. return $acl->isAllowed($role ,$setController,$action);
  33.  
  34. }
  35. }

I po wywolaniu ostatniej linijki "isAllowed", dzieje się tak ze zwraca mi ze uzytkownik jest zalogowany i ma dostep do tego zasobu, jednak jak przechodze na nastepna strone, automatycznie zostaje wylogowany. Nie wiem co jest grane.

W pluginie mam juz raz zastosowane isAllowed, wtedy jesli nie jest autoryzowany to przekierowywuje na glowna. Czy ma jakies znaczenie ze uzywam tego drugi raz ? Jak Wy rozwiazujecie ten problem ?

Pozdrawiam Adrian
Pilsener
Ja tam robię prosto, w kontrolerze:
  1. $auth = Zend_Auth::getInstance();
  2. $this->view->isLogged = $auth->hasIdentity();

W widoku:
  1. if($this->isLogged):
  2. //tu zawartość dla zalogowanego
  3. endif


Cytat
jesli nie jest autoryzowany to przekierowywuje na glowna
- to najlepiej jest zrobić w kontrolerze dodając metodę init (zostanie ona automatycznie wywołana razem z kontrolerem), tam należy ustalić, czy user ma dostęp do danego kontrola i wykonać odpowiednią akcję (np. przekierowanie) lub dodać do widoku zmienne, które nam ten widok spersonalizują.
quality
No tak, to jest standardowe sprawdzenie, to mam zrobione w pluginie i dziala bardzo dobrze.

Jednak co zrobic jesli w danym kontrolerze chce sprawdzic czy uzytkownik ma dostep do innego kontrolera ?

Poza tym nie wystarczy mi sama informacja czy jest zalogowany, potrzebne mi sa odpowiednie role, stad metoda isAllowed().
Pilsener
No to daj na początku kontrolera:
  1.  
  2. protected $acl;
  3. public function init()
  4. {
  5. $this->acl = new Model_Acl();
  6. //tu można wrzucić do widoku kontrolera wszystkie role usera lub tylko te, które są nam potrzebne
  7. }


Co do sprawdzania dostępu do innych kontrolerów to wygodnej i wydajnej metody raczej nie ma, akurat padła strona ZF i nie mogę zajrzeć do dokumentacji :/
quality
Hmmm nie rozumiem Twojej wypowiedzi Pilsener.

Nie mam Acl w modelu tylko w bootstrapie.

Co mi da taki model ?

Ten kod co napisalem sprawdza mi role w innym kontrolerze i akcji ( takiej jak podam w parametrach), niestety zaraz po sprawdzeniu ( sprawdza prawidlowo) wylogowywuje (usuwa sesje). Nie wiem dlaczego.

Metode Acl "isAllowed()" wywoluje raz w pluginie (sprawdza on dostep do obecnego zasobu), i wlasnie ponowne wywolanie juz w widoku ( sprawda dostep do innego zasobu niz jestesmy) powoduje takie dziwne zachowanie.



Eh zauwazylem teraz dziwna przypadlosc. Jedno odswiezenie uzytkownik jest zlogowany, drugie juz nie i tak co chwile :/

Nie wiecie co moze byc nie tak ?

Logowanie i sesje mam na bazie danych.

Update:
Zauwazylem ze skrypt szaleje po dodaniu opcji Zend_Session_SaveHandler_DbTable.
Zapisuje sesje w bazie za pierwszym razem prawidlowo, a po odswiezeniu od razu ja usuwa.

Po wylaczeniu tego wszystko dziala prawidlowo.

Wczesniej save handler tez dzialal prawidlowo. Nie wiecie co moze miec wplyw na zapis sesji w bazie danych ?

Mial ktos podobny przypadek ?

Pozdrawiam Adrian
Pilsener
Cytat
Co mi da taki model ?
- bo to są dane (role, zasoby, całe drzewo), a od danych są modele, ale możesz to robić w bootstrapie czy rejestrze, każdy niech robi jak mu wygodnie smile.gif

Możesz zresztą najprościej:
  1. $acl = new Zend_Acl();


I teraz dodać rolę, zasób i potestować kilka wywołań isAllowed

Dziwnie to wygląda u Ciebie z tymi sesjami :/ Może spróbuj wyczyścić dane z przeglądarek?

I nie jestem pewien, czy zasób = kontroler a przywilej = akcja? Może tu jest problem?
Cytat
jesli uzytkownik ma dostep do dodawania artykolu
- to może trzeba zdefiniować role i zasoby odpowiedzialne za moderacje/administrację artykułów? Nie korzystałem z isAllowed by sprawdzić, czy user ma dostęp do danego kontrolera/akcji, być może tu coś szwankuje, spróbuj dodać kilka zasobów i parę razy wywołać isAllowed, ciekawe co się stanie.
quality
No to otoz tak.

Acl mam zbudowane w bootstrapie. Wlasnie na zasadzie new Acl i dodawanie rol i zasobow.

U mnie zasob = modul_kontroller a przywilej = akcja.

Teraz po terstowaniu skryptu widze ze ogolnie cala sesja zle dziala, i nie jest to wina powtorzenia isAllowed() tylko samej sesji.

Otoz dziala to bardzo dziwnie.

Mam dodanego session handlera na baze:
  1. $configOrg = array(
  2. 'name' => 'session',
  3. 'primary' => 'id',
  4. 'modifiedColumn' => 'modified',
  5. 'dataColumn' => 'data',
  6. 'lifetimeColumn' => 'lifetime'
  7. )
  8. Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($configOrg));
  9. Zend_Session::setOptions(array('cookie_domain' => '.'.$this->base));
  10. Zend_Session::start();


Po probie zalogowania w bazie pojawia mi sie takie cos zamiast zserializowanych danych: "Zend_Auth|N;"

Nie wiem co jest grane.

UPDATE:
Hmmm bardzo dziwna sytuacja.
Nie wiem czy ktos sie spotkal z takim czyms.

Problem lezy w kodowaniu bazy danych.
Cala baze mam kodowana w utf8_general_ci, aby nie bylo krzaczkow na stronie dodaje zapytanie na wstepie w bootstrapie:
  1. $this->bootstrap('Db');
  2. $db = $this->getResource('Db');
  3. $db->query("SET CHARACTER SET utf8;");
  4. $db->query("SET NAMES 'utf8';");


To wlasnie powoduje szalenie sesji na bazie danych. Macie jakis pomysl jak to rozwiazac ?

Usuniecie tych linijek powoduje wysypanie sie polskich znakow na stronie :/

Hmmm usunalem te zapytania z bootstrapa i wsadzilem bezposrednio w model ( w init()). Poki co dziala prawidlowo. Mimo wszystko problem bardzo dziwny.
Czym bardziej wnikam w zenda i czym wiecej komponentow stosuje tym wiecej problemow wystepuje.

Nastepny problem, oczywiscie kodowanie: Powlaczeniu cache (core), cachowana jest lista artykulow + paginacja = krzaczki polskich znakow :/ eh
pozdrawiam Adrian
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.