Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Zend ACL i moduły
Forum PHP.pl > Forum > PHP > Frameworki
requiemos
Mam taki problem.
Mam 2 moduły: default i admin.
I teraz mam swój ACL, w którym chciałbym zablokować "guestowi" wszystkie zasoby modułu "admin" poza kontrollerem auth
  1. <?php
  2.  
  3. class My_Plugin_Acl extends Zend_Controller_Plugin_Abstract {
  4.  
  5. public function preDispatch(Zend_Controller_Request_Abstract $request) {
  6. $acl = new Zend_Acl;
  7. // dodajemy role
  8. $acl->addRole(new Zend_Acl_Role('guest'));
  9. $acl->addRole(new Zend_Acl_Role('admin'));
  10. // dodajemy zasoby
  11. $acl->add(new Zend_Acl_Resource('index'));
  12. $acl->add(new Zend_Acl_Resource('post'));
  13. $acl->add(new Zend_Acl_Resource('error'));
  14. $acl->add(new Zend_Acl_Resource('admin'));
  15. $acl->add(new Zend_Acl_Resource('admin:index'));
  16. $acl->add(new Zend_Acl_Resource('admin:post'));
  17. $acl->add(new Zend_Acl_Resource('admin:user'));
  18. $acl->add(new Zend_Acl_Resource('admin:error'));
  19. $acl->add(new Zend_Acl_Resource('admin:auth'));
  20.  
  21.  
  22. // przydzielamy prawa
  23. $acl->allow('guest', 'index');
  24. $acl->allow('guest', 'post');
  25. $acl->allow('guest', 'error');
  26. $acl->allow('guest', 'admin');
  27. $acl->deny('guest', 'admin:index');
  28. $acl->allow('guest', 'admin:auth');
  29.  
  30. $acl->allow('admin', null); // admin ma nieograniczone uprawnienia
  31. // rozpoczynamy sprawdzanie uprawnień
  32. $auth = Zend_Auth::getInstance();
  33. if ($auth->hasIdentity()) {
  34. $identity = $auth->getIdentity()->role;
  35. $role = $identity;
  36. } else {
  37. $role = 'guest';
  38. }
  39. $controller = $request->controller;
  40. $action = $request->action;
  41.  
  42. if (!$acl->isAllowed($role, $controller, $action)) {
  43. if ($role == 'guest') {
  44. $request->setModuleName('admin');
  45. $request->setControllerName('auth');
  46. $request->setActionName('login');
  47. } else {
  48. $request->setControllerName('error');
  49. $request->setActionName('error');
  50. }
  51. }
  52. }
  53.  
  54. }
  55.  

To jest moja klasa, wszystko spięte i działa, poza tym że nie mogę zmusić do zablokowania zasobów modułu admin.
Ktoś ma jakiś pomysł?
grOm
poczytaj o dziedziczeniu ról i resursów
przyjrzyj sie temu :
  1. <?php
  2.  
  3. class My_Acl extends Zend_Acl {
  4.  
  5.  
  6. public function __construct() {
  7.  
  8. $this->addResource(new Zend_Acl_Resource('default'))
  9. ->addResource(new Zend_Acl_Resource('default:index'), 'default')
  10. ->addResource(new Zend_Acl_Resource('default:error'), 'default');
  11.  
  12. $this->addResource(new Zend_Acl_Resource('auth'))
  13. ->addResource(new Zend_Acl_Resource('auth:auth'), 'auth');
  14.  
  15. $this->addResource(new Zend_Acl_Resource('lang'),'default')
  16. ->addResource(new Zend_Acl_Resource('lang:switch'),'lang');
  17.  
  18. $this->addResource(new Zend_Acl_Resource('thumb'), 'default')
  19. ->addResource(new Zend_Acl_Resource('thumb:index'),'thumb');
  20.  
  21. $this->addResource(new Zend_Acl_Resource('blog'),'default')
  22. ->addResource(new Zend_Acl_Resource('blog:index'),'blog');
  23.  
  24. $this->addResource(new Zend_Acl_Resource('admin'))
  25. ->addResource(new Zend_Acl_Resource('admin:index'), 'admin')
  26. ->addResource(new Zend_Acl_Resource('admin:error'), 'admin')
  27. ->addResource(new Zend_Acl_Resource('admin:news'), 'admin')
  28. ->addResource(new Zend_Acl_Resource('admin:channel'), 'admin');
  29.  
  30.  
  31.  
  32. $this->addRole(new Zend_Acl_Role('guests'));
  33. $this->addRole(new Zend_Acl_Role('users'), 'guests');
  34. $this->addRole(new Zend_Acl_Role('admins'), 'users');
  35.  
  36. $this->allow('guests','default');
  37. $this->allow('admins');
  38. }
  39.  
  40.  
  41. }
requiemos
Zmodyfikowałem moją klasę
  1. class My_Plugin_Acl extends Zend_Controller_Plugin_Abstract {
  2.  
  3. public function preDispatch(Zend_Controller_Request_Abstract $request) {
  4. $acl = new Zend_Acl;
  5. // dodajemy role
  6. $acl->addRole(new Zend_Acl_Role('guest'));
  7. $acl->addRole(new Zend_Acl_Role('admin'));
  8. // dodajemy zasoby
  9. $acl->addResource(new Zend_Acl_Resource('index'))
  10. ->addResource(new Zend_Acl_Resource('post'))
  11. ->addResource(new Zend_Acl_Resource('error'));
  12.  
  13. $acl->addResource(new Zend_Acl_Resource('admin'))
  14. ->addResource(new Zend_Acl_Resource('admin:index','admin'))
  15. ->addResource(new Zend_Acl_Resource('admin:post','admin'))
  16. ->addResource(new Zend_Acl_Resource('admin:panel','admin'))
  17. ->addResource(new Zend_Acl_Resource('admin:auth','admin'))
  18. ->addResource(new Zend_Acl_Resource('admin:user','admin'));
  19. // przydzielamy prawa
  20. $acl->allow('guest', 'index');
  21. $acl->allow('guest', 'admin:auth');
  22. $acl->allow('guest', 'post');
  23.  
  24. $acl->allow('admin'); // admin ma nieograniczone uprawnienia
  25. // rozpoczynamy sprawdzanie uprawnień
  26. $auth = Zend_Auth::getInstance();
  27. if ($auth->hasIdentity()) {
  28. $identity = $auth->getIdentity()->role;
  29. $role = $identity;
  30. } else {
  31. $role = 'guest';
  32. }
  33. $controller = $request->controller;
  34. $action = $request->action;
  35.  
  36. if (!$acl->isAllowed($role, $controller, $action)) {
  37. if ($role == 'guest') {
  38. $request->setModuleName('admin');
  39. $request->setControllerName('auth');
  40. $request->setActionName('login');
  41. } else {
  42. $request->setControllerName('error');
  43. $request->setActionName('error');
  44. }
  45. }
  46. }
  47.  
  48. }

I wciąż nie mogę otrzymać porządanego efektu.
Gdy jest 'guestem' wchodząc na /admin/panel spodziewam się że przekieruje mnie do admin/auth/login.
Zamiast tego dostaje błąd:Resource 'panel' not found.
Załączam application.ini, może tu coś jest nie tak.
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.frontController.plugins.acl = "My_Plugin_Acl"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
snapshot
Nie działa ponieważ sprawdzasz dostęp dla kontrolera, czyli np dla index a nie admin:index. Musisz dokleić na początku $controller nazwę modułu jeśli jest inny niż default.
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.