Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zend ACL dwa moduły.
Forum PHP.pl > Forum > PHP > Frameworki
cykcykacz
Witam,
staram się dodać acl do aplikacji w której mam dwa moduły: default, admin.
  1. class Plugin_Acl extends Zend_Controller_Plugin_Abstract
  2. {
  3. public function preDispatch(Zend_Controller_Request_Abstract $request)
  4. {
  5. // set up acl
  6. $acl = new Zend_Acl();
  7.  
  8. // add the roles
  9. $acl->addRole(new Zend_Acl_Role('guest'));
  10. $acl->addRole(new Zend_Acl_Role('user'), 'guest');
  11. $acl->addRole(new Zend_Acl_Role('administrator'), 'user');
  12.  
  13. /** Default module */
  14. $acl->add(new Zend_Acl_Resource('index'))
  15. ->add(new Zend_Acl_Resource('index2'));
  16.  
  17. /** Admin module */
  18. $acl->add(new Zend_Acl_Resource('admin'))
  19. //->add(new Zend_Acl_Resource('index', 'admin'))
  20. ;
  21. // add the resources
  22.  
  23. $acl->allow('guest', 'index')
  24. ->allow('guest', 'index2')
  25. ->deny('guest','admin', 'index');
  26.  
  27. $auth = Zend_Auth::getInstance();
  28. if($auth->hasIdentity()) {
  29. $identity = $auth->getIdentity();
  30. $role = strtolower($identity->role);
  31. }else{
  32. $role = 'guest';
  33. }
  34. $controller = $request->controller;
  35. $action = $request->action;
  36. if (!$acl->isAllowed($role, $controller, $action)) {
  37. if ($role == 'guest') {
  38. $request->setControllerName('user')
  39. ->setActionName('login')
  40. ->setModuleName('admin');
  41. } else {
  42. $request->setControllerName('error')
  43. ->setActionName('noauth');
  44. }
  45. }
  46. }


I nie wiem dlaczego ale jak ustawię $acl->allow('guest', 'index'), gość ma wstęp do admin/index. A chcę aby miał dostęp do "default/index" a nie do "admin/index".
nid3
Proszę to jest poprawny kod AclPlugin. Proszę popatrz jak są realizowane Allow i dziedziczenia praw (addRole('client', 'guest')wink.gif

  1. $acl->allow('guest', 'admin:index', 'index');

odpowiednio -> rola, modul:controler, akcja



  1. <?php
  2.  
  3. class Extra_AclPlugin extends Zend_Controller_Plugin_Abstract {
  4.  
  5. public function preDispatch(Zend_Controller_Request_Abstract $request) {
  6.  
  7. $acl = new Zend_Acl();
  8. $acl->addRole('guest');
  9. $acl->addRole('client', 'guest');
  10. $acl->addRole('admin');
  11.  
  12. $acl->addResource('default:index');
  13. $acl->addResource('default:error');
  14.  
  15. $acl->addResource('content:index');
  16. $acl->addResource('content:admin');
  17.  
  18. $acl->addResource('gallery:index');
  19. $acl->addResource('gallery:admin');
  20.  
  21. $acl->addResource('admin:index');
  22. $acl->addResource('admin:admin');
  23.  
  24. $acl->addResource('admin');
  25.  
  26. $acl->allow('guest', 'default:index');
  27. $acl->allow('guest', 'default:error');
  28. $acl->allow('guest', 'content:index');
  29. $acl->allow('guest', 'gallery:index');
  30.  
  31. $acl->allow('guest', 'admin:index', 'index');
  32. $acl->allow('guest', 'admin:index', 'login');
  33.  
  34. // $acl->allow('guest', 'default:index', 'register');
  35. // $acl->allow('guest', 'default:error');
  36. // $acl->allow('client', 'default:index', 'logout');
  37. // $acl->allow('client', 'default:index', 'edit-profile');
  38.  
  39. $acl->allow('admin');
  40.  
  41. /* Użytkownik */
  42. $user = Zend_Auth::getInstance()->getIdentity();
  43. if (null === $user) {
  44. $role = 'guest';
  45. } else {
  46. $role = $user->role;
  47. }
  48.  
  49. /* Czy użytkownik ma prawo dostępu? */
  50. if (!$acl->isAllowed($role, $request->getModuleName() . ':'
  51. . $request->getControllerName(), $request->getActionName())) {
  52. throw new Exception('Nie masz dostępu do tej części witryny!');
  53. }
  54. }
  55.  
  56. }
  57.  
  58. ?>
mortus
Po pierwsze nigdzie tutaj nie uwzględniasz zasobu default, a zapis:
  1. $acl->allow('guest', 'index');

nie jest jednoznaczny.
Po drugie (i z tego wynika pierwsze) podczas sprawdzania dostępu użytkownika do zasobu nie uwzględniasz w ogóle modułu, jak widać w tej linijce:
  1. if (!$acl->isAllowed($role, $controller, $action)) {


Oto, jak programiści Zend-a proponują rozwiązać kwestię uprawnień do modułów.

EDIT: Widzę, że kolega @nid3 mnie uprzedził podając rozwiązanie "na tacy". Jednak równie poprawnym pluginem będzie taki, w którym zastąpimy : (dwukropek) innym nietypowym znakiem.
nid3
+1

Cytat
EDIT: Widzę, że kolega @nid3 mnie uprzedził podając rozwiązanie "na tacy". Jednak równie poprawnym pluginem będzie taki, w którym zastąpimy : (dwukropek) innym nietypowym znakiem.


Tak, ale nie zdradziłem jak dodaje role do użytkowników. wink.gif. Faktycznie następnym razem pokażę "wędkę i jak pomoc w łowieniu ryb, a nie całą rybę ". Ale czasami sam wole postudiować dobrze napisany kod i na jego bazie się pouczyć, a nie wertować w błędnych, lub nie kompletnych artykułach.

Pozdrawiam
cykcykacz
Witam,
dzięki za pomoc skorzystałem z kodu nid3 wszystko działa prawidłowo.

Faktycznie podałem mało uporządkowany kod, bawiłem się ale nie mogłem dojść co jest źle.
Korzystałem z artykułu, http://devzone.zend.com/1269/zend_acl-and-...i-advanced-use/ ale u mnie miałem problem z poprawnym działaniem.
Jeszcze raz dzięki.
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.