Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Jak zrobić sprawdzanie uprawnień użytkownika
Forum PHP.pl > Forum > PHP > Frameworki
juzwa
Co prawda swego czasu cyphelf wspomógł mnie linkiem

http://www.nabble.com/Zend_Acl---Zend_Auth...5728s16154.html

ale ja oporny jestem trochę i nie wiem jak się do tego zabrać


chodzi mi o sytuację taką jak na forum, w jakiś panelu administracyjnym itp itd

jak ja to robiłem to w bazie była tabela user z jego id, loginem, hasłem oraz listą uprawnień w systemie w stylu dodawanie,edycja,usuwanie,admin itp itd

przy logowaniu ładowało się to do zmiennych sesji i sprawdzało np

  1. <?php
  2. if(!$_SESSION['user']['edycja'])
  3.  /// przejdź do strony z komunikatem, że nie znalezniono strony lub brak uprawnień l
    ub co tam kto chciał
  4. ?>


czytałem o ACL - głupie to nie jest - ale jakoś nie umiem, nie wiem jak to wykorzystać w normalnej aplikacji

chodzi mi o to, aby ktoś wytłumaczył mi jak to się robi w ZF

w przykładzie z linku od cyphelfa jest to zrobione pod jakiś system katalogów - a ja mam system katalogów taki zwyczajny z tutoriala ściągnięty - mam w katalogu controllers jakieś kontrolery a w nich jakieś akcje
przykładowo

  1. <?php
  2. function addrecordAction()
  3. {
  4. //dodawanie rekordu do bazy
  5. }
  6. ?>


czy wobec tego sprawdzać to w funkcji?

w przykładzie tym od cyphelfa jest wykorzystany plugin

czy to się robi wobec tego tak

  1. <?php
  2. public function preDispatch($request)
  3. {
  4. $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
  5. $appPath=Zend::registry('appPath');
  6.  
  7. $akcja=$request->getRequestUri()
  8.  
  9. switch ($akcja)
  10. {
  11.  case 'news/addrecord':
  12.  case 'user/addrecord':
  13. //sprawdź czy może dodawać - zwróć true albo false
  14. break;
  15.  case 'news/editrecord':
  16.  case 'user/editrecord':
  17. //sprawdź czy może edytować - zwróć true albo false
  18.  break;
  19.  
  20. }
  21.  
  22.  if(false)
  23.  {
  24.  $request->setControllerName('error')//może być tam z jakiś parametrem
  25.  ->setActionName($dispatcher->getDefaultAction())
  26. ->setDispatched();
  27.  }
  28.  
  29. }
  30. ?>



jak na razie to mam ochotę zrobić to po staremu, ale może jest jakiś sposób który zarządzanie uprawnień czyni rzeczą prostą i przyjemną i łatwą
patrycjusz
Dobra to pokolei, w bootstrapie (index.php) do kontrollera frontowego dodaje sobie plugin sprawdzający autoryzację, dodatkowo ładuję uprawnienia z pliku Xml. Skrawki kodu poniżej.
  1. <?php
  2. //Dodajemy plugin do Front Controllera
  3. $controller->registerPlugin(new Ti_Plugin_Auth());
  4.  
  5. //Tworzymy sobie listę uprawnień
  6. if(!$acl = $cache->load('acl')){
  7. $aclFile = @simplexml_load_file('application/config/acl.xml');
  8. if(!$aclFile instanceof SimpleXMLElement ){
  9. throw new Exception("Given web-acl.xml file is't valid xml file!");
  10. }
  11.  
  12. $acl = new Zend_Acl();
  13. foreach($aclFile->role->children() as $role){//pętla tworząca role
  14. if($role['extends']){
  15. $acl->addRole(new Zend_Acl_Role($role->getName()),explode(',',$role['extends']));
  16. }else{
  17. $acl->addRole(new Zend_Acl_Role($role->getName()));
  18. }
  19. }
  20. foreach ($aclFile->resource->children() as $parentResource){//pętle przypisujace uprawnienia do kontrollerów poszczególnych ról
  21. $acl->add(new Zend_Acl_Resource($parentResource->getName()));
  22. if($parentResource->attributes()){
  23. foreach ($parentResource->attributes() AS $type => $roles){
  24. $acl->{$type}(explode(',',$roles),$parentResource->getName());
  25. }
  26. }else{//jeżeli resource nie zawiera atrybutu allow lub deny przypisz rolę oznaczoną default="default"
  27. $acl->allow($defaultRole[0]->getName(),$parentResource->getName());
  28. }
  29. foreach($parentResource->children() AS $resource){
  30. $resourceName = $parentResource->getName().'_'.$resource->getName();
  31. $acl->add(new Zend_Acl_Resource($resourceName));
  32. if($resource->attributes()){
  33.  
  34. foreach ($resource->attributes() AS $type => $roles){
  35. $acl->{$type}(explode(',',$roles),$resourceName);
  36. }
  37. }elseif(!$resource->attributes() && $parentResource->attributes()){//jeżeli resource nie zawiera atrybutu allow lub deny lecz zawiera go jego rodzi
    c
  38.  
  39. foreach ($parentResource->attributes() AS $type => $roles){
  40. $acl->{$type}(explode(',',$roles),$resourceName);
  41. }
  42. }else{//jeżeli resource nie zawiera atrybutu allow lub deny i jego rodzic również przypisz rolę oznaczoną default="default"
  43. $acl->allow($defaultRole[0]->getName(),$resourceName);
  44. }
  45. }
  46. }
  47. $cache->save($acl,'acl');
  48. }
  49. Zend::register('Zend_Acl',$acl);
  50.  
  51. //w pluginie autoryzującym mamy coś takiego
  52. public function preDispatch($request){
  53. $tiUser = Zend::registry('Ti_User');
  54. if(!Zend::registry('Zend_Acl')->isAllowed($tiUser->getRole(),$request->getControllerName().'_'.$request->getActionName())){
  55. throw new Ti_Acl_Exception("You don't have rights to run this action");
  56. }
  57. }
  58. //oczywiście zamiast wyjątku możesz sobie wrzucić np header i exit() ;)
  59. ?>


No i oczywiście skrawek pliku uprawnień winksmiley.jpg
  1. <webAcl>
  2.      
  3.      <role>
  4.            <anonymous default="default"/>
  5.            <admin extends="anonymous"/>
  6.      </role>
  7.      
  8.      <resource>
  9.            
  10.            <articles allow="anonymous">
  11.                  <listArticles/>
  12.                  <readArticle allow="admin"/>
  13.                  <showArticlesSearchResults/>
  14.                  <addCategory/>
  15.                  <addComment/>
  16.            </articles>

Oczywiście jest to tylko przykład, jednak co najważniejsze działa nieźle smile.gif
W najbliższym czasie zgłębie pewnikiem z zespołem troche bardziej nowszą wersję ZF i wtedy stworzymy coś z prawdziwego zdarzenia. Póki co ta wersja działa i nie nastręcza żadnych problemów. Dodatkowo jest bardzo elastyczna i przy minimalnym nakładzie czasu można ją rozszerzyć, zmienić winksmiley.jpg

pzdr, patS
juzwa
bardzo dziękuję za odpowiedź i za przykład
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.