Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZendFramework] Panel usera i panel admina w jednym projekcie, zend auth
tomsol
post
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 1
Dołączył: 15.01.2012

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
KrzysiekWildfire
post
Post #2





Grupa: Zarejestrowani
Postów: 93
Pomógł: 11
Dołączył: 27.10.2010
Skąd: Kutno/Poznań

Ostrzeżenie: (0%)
-----


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();
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 23:59