Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Panel usera i panel admina w jednym projekcie
Forum PHP.pl > Forum > PHP > Frameworki
tomsol
Witajcie,
mam pewną zagwozdkę.

Chcę utworzyć w jednym projekcie dwa interfejsy admina i usera przy użyciu zend auth.
Ok, tworze dwa osobne kontrolery dla usera i admina, wszystko działa. User sie loguje do swojego panelu, admin do swojego - praktycznie działa w 90%

Pojawił się problem. Jeżeli zalogujemy się na admina, nastepnie nie wylogujemy się ze swojego profilu, to możemy wejść na profil usera. Podobnie jest w drugą stronę... a to poważny bląd.

Czy istnieje jakieś rozwiązanie w zend aby rozdzielić zend auth dla usera i admina ?

Dla usera i admina zastosowałem w kontrolerze takie rozwiązanie:
  1. class AuthController extends Zend_Controller_Action
  2. {
  3. public function init()
  4. {
  5. /* Initialize action controller here */
  6. }
  7.  
  8. public function indexAction()
  9. {
  10. $form = new Application_Form_Login();
  11. $request = $this->getRequest();
  12. if ($request->isPost()) {
  13. if ($form->isValid($request->getPost())) {
  14. if ($this->_process($form->getValues()))
  15. {
  16. $this->_helper->redirector('index', 'index');
  17. }
  18. else
  19. {
  20. $this->view->blad = 'Błędne dane';
  21. }
  22. }
  23. }
  24. $this->view->form = $form;
  25. }
  26.  
  27. protected function _process($values)
  28. {
  29. // Get our authentication adapter and check credentials
  30. $adapter = $this->_getAuthAdapter();
  31. $adapter->setIdentity($values['username']);
  32. $adapter->setCredential($values['password']);
  33.  
  34. $auth = Zend_Auth::getInstance();
  35. $result = $auth->authenticate($adapter);
  36. if ($result->isValid()) {
  37. $user = $adapter->getResultRowObject();
  38. $auth->getStorage()->write($user);
  39. return true;
  40. }
  41. return false;
  42. }
  43.  
  44. protected function _getAuthAdapter()
  45. {
  46. $dbAdapter = Zend_Db_Table::getDefaultAdapter();
  47. $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
  48.  
  49. $authAdapter->setTableName('system_customers')
  50. ->setIdentityColumn('username')
  51. ->setCredentialColumn('password')
  52. ->setCredentialTreatment('SHA1(CONCAT(?,salt))');
  53.  
  54. return $authAdapter;
  55. }
  56.  
  57. public function logoutAction()
  58. {
  59. Zend_Auth::getInstance()->clearIdentity();
  60. return $this->_redirect('/');
  61. }
  62.  
  63. }


Proszę o pomoc.
tvister
Proponował był rozbicie tego na schemat uprawnień oparty na ACL-u
tomsol
Hm... jest to pewne rozwiązanie, tylko ja nie chce tworzyć nowych ról...

Gdzieś obiło mi się o wzrok, że można ustawić osobne namespace dla zend auth, dzięki czemu możemy rozdzielić zend auth na dwie osobne sesje i nic nam nie bedzie kolidować.
Tylko nie umie znaleść tutoriali do tego.
KrzysiekWildfire
Osobiście proponowałbym trzymać panele usera i admina w osobnych modułach a nie kontrolerach - daje to większe pole do manewru.

Ale jeżeli umieściłeś wszystko w kontrolerach, to mam dla Ciebie prostrze rozwiązanie. W jakiś sposób musisz rozpoznawać, czy użytkownik jest administratorem, jeżeli ta informacja jest zapisana w jego rekordzie w bazie, to możesz w funkcji init() kontrolera sprawdzać, czy zalogowany użytkownik ma możliwość dostępu do tego kontrollera. Jeżeli nie ma, to wtedy możesz przekierować użytkownika do akcji denied:

  1. public function init(){
  2. if (!Zend_Auth::getInstance()->hasIdentity())
  3. $this->_forward('login');
  4. if (Zend_Auth::getInstance()->getIdentity()->role != 'admin')
  5. $this->_forward('denied');
  6. }


Jeżeli chcesz przekierować użytkownika do innego kontrolera, musisz umieścić powyższy skrypt w funkcji postDispatch();
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.