Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Zend_Framework] autoryzacja dla wybranych rekordów tabeli
Forum PHP.pl > Forum > PHP > Frameworki
konys
Witam

Stawiam pierwsze kroki z zaawansowanymi systemami autoryzacji użytkownika. Natknąłem się na podstawowy problem, którego jakoś nie mogę rozwiązać:

Mam tabelę 'dane':

id
owner_id
jakies_dane

i chcę by użytkownik z grupy 'user' mógł przeprowadzać operacje jedynie na swoich rekordach (wg. owner_id).

Czy da się to zrobić używając Zend_Acl? Jeśli tak, to w jaki sposób (czy dołoby radę skonstruować zasób (Zend_Acl_Resource) reprezentujący wszystkie rekordy wybranego użytkownika)?

Ponieważ mój projekt bazuje na Zend Framework najchętniej wykorzystałbym autoryzację w nim zaimplementowaną, jestem jednak otwarty na inne propozycje.
andrzejb
o fajny temat tak jest taka mozliwosc ACL, ACO czyli twoj rekord(jest obiektem kontorli dostepu) i lapiesz kto o niego sie ubiega. Jedyny problem jest w masie informacji ktora bedzie musiala zostac zapisana do kazdego rekordu na temat praw i tu pojawia sie problem jako ze natykasz sie na przerost formy nad trescia mi natomiast wystarczylo takie rozwiazanie

  1. <?php
  2. //simpleAcces Control lib v1.2 by andriu 26.01.2006
  3. //na wejsciu obiekt to tabela z elementami czyli wierszami,
  4. // client to id uzytkownika probojacego uzyskac dostep do obiektu :)
  5. // zmienna sStatus zapamietuje prawa uzytkownika 
  6. // ^export to: /controllers/components/othauth.php 1.10.2006
  7. function acces($obiect,$element,$client=0){
  8. //sprawdzamy czy istenieje id uzytkownika
  9. if(is_numeric($client) && $client > 0){
  10. $sql=mysql_query("SELECT id, user_id FROM ".$obiect.
  11. WHERE id='".$element."' LIMIT 1");
  12. //sprawdzamy czy istenieje obiekt
  13. if(@mysql_num_rows($sql)>0){
  14. $row=mysql_fetch_array($sql);
  15. //sprawdzamy czy wlascicielem jest uzytkownik
  16. if ($row['user_id']==$client){
  17. return 1;
  18. }else{
  19. //sprawdzamy prawa uzytkownika 
  20. if($this->sStatus!='check'){
  21. if($this->sStatus>3){
  22. return 1;
  23. }else{
  24. return 0;
  25. }
  26. }else{
  27.  $sql_user=mysql_query("SELECT id, Status FROM milf_user 
  28. WHERE id='".$client."' LIMIT 1");
  29. $usr=@mysql_fetch_array($sql_user);
  30. if($usr['Status']>2){
  31. //zapisujemy prawa w zmiennej klasy
  32. $this->sStatus=$usr['Status'];
  33.  return 1;
  34. }else{
  35. return 0;
  36. } 
  37. }
  38.  
  39.  
  40. }
  41. }else{
  42. $this->error.="Cant found element in obiect";
  43. return 0;
  44. }
  45.  
  46. }else{
  47. return 0;
  48. }
  49. }
  50. ?>


to stary kod ale powinien cos zobrazowac
konys
Też mi nie pasowało wpisywanie wszystkich rekordów "z góry" do ACL, ale udało mi się poradzić z tym problemem dzięki zastosowaniu Assertu w Zend_Acl, który porównuje pole w bazie danych z odpowiadającą mu wartością zapisywaną w trakcie autentykacji. Mimo wszystko dzięki za nadesłane rozwiązanie.
andrzejb
kurcze gdzie to jest opisane bo w dokumentacji jakos tego nie widze
Zyx
Do ACL można wstawić ogólną regułę kontroli autorstwa zasobu. Przykładowo, jeśli stwierdzisz, że użytkownik ma prawa do "akcja_allow_all" (nazwij to sobie, jak chcesz), to może on modyfikować wszystkie rekordy, w przeciwnym razie w PHP sam już odpalasz własny kod, który sprawdza zgodność autora. W ACL'u nie trzeba wszystkiego ładować do tej struktury uprawnień, bo to się mija z celem. W swoim kodzie umieszczam tam jedynie te dane, o których wiem, że na danej stronie się mogą przydać, czyli naraz jest ładowana tylko jedna rola oraz część uprawnień.
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.