Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Podstawy obiektowego ACL
Forum PHP.pl > Forum > Przedszkole
Mefiuu
Witam. Zwracam się do Was z prośbą o porady. Planuję stworzyć portal, ma być dość rozbudowany. Zastanawiałem się jak stworzyć listę ACL, czytałem nieco w sieci na ten temat, ostatecznie skrobnąłem taki kawałek kodu:


  1. public function check($group_id) {
  2. $stmt = $this->pdo->query("SELECT * FROM groups WHERE group_id='$group_id'");
  3.  
  4. $this->privilages = $stmt->fetch(PDO::FETCH_ASSOC);
  5.  
  6. $stmt->closeCursor();
  7.  
  8. return $this->privilages;
  9. }


Jest to funkcja zawarta w klasie, jako parametr przekazuję $_SESSION['group_id'], które przypisuję sobie podczas logowania. Po wykonaniu takiego skryptu w tablicy mam zawarte wszystkie uprawnienia dla grupy. W tabeli to wygląda mniej więcej tak:

grupa | NA | WW | EA |
===============================
Administratorzy | 1 | 1 | 1 |
--------------------------------------------------------
Moderatorzy | 1 | 0 | 1 |
--------------------------------------------------------
Użyszkodnicy | 0 | 0 | 0 |
===============================


Jak widać, nagłówki odpowiadają za poszczególne prawa. 1 logiczna ma dostęp, 0 nie ma. Przypuśćmy że chciałbym dla użytkowników ustalać menu:

  1.  
  2. echo "<a href='#'>Dodaj plik</a>"; //dostępne dla wszystkich
  3. if ($login->privilages['NA'] == 1) echo "<a href='#'>Nowy artykuł</a>"; // dostęp dla Adminów i Moderków
  4. if ($login->privilages['WW'] == 1) echo "<a href='#'>Wyślij wiadomość</a>"; // Dostęp tylko dla Admina
  5. if ($login->privilages['EA'] == 1) echo "<a href='#'>Edytuj artykuł</a>"; // Dostęp dla Admina i Moderka
  6.  



Moje pytanie jest takie. Zakładając (przy najlepszych wiatrach), że będę miał w bazie wielu użytkowników (liczmy kilkanaście tysięcy), czy to BĘDZIE WYDAJNE ? Nie wiem jak inaczej można byłoby to rozwiązać, to rozwiązanie wydaje mi się całkiem sensowne, ale proszę o poradę bardziej doświadczonych użytkowników.

Pozdrawiam.
!*!
A gdzie zasób, skoro to ACL? Nic mi określenia w bazie NA | WW | EA nie mówią, co one oznaczają?
Zakładając że coś takiego zaimplementujesz, to co w przypadku, gdy użytkownikowi będziesz chciał dać do jakiegoś modułu prawa admina/moderatora?
Przeczytaj to http://www.php.pl/Wortal/Artykuly/Proces-t...L-Jak-korzystac jest to moim zdaniem jeden z lepszych tekstów wyjaśniających sposób działania ACL jako tako, z tym że Ty to przeniesiesz do bazy, ale to raczej nie będzie stanowić problemu.
Mefiuu
nie rozumiem, jaki zasób, mógłbyś wyjaśnić ?

Gdy będę chciał komuś coś nadać / odebrać, to po prostu zaimplementuję sobie odpowiedni panel z checkboxami i będę odznaczał, zaznaczał, podobnie jest w PHP-Fusion z tego co widziałem.

To w jaki sposób powinienem nadać określenia w bazie ? Te skróty są umowne, bo oczywiście mógłbym mieć takie nagłówki jak "NowyArtykuł", "WyślijWiadomość", "EdytujArtykuł" ale po prostu zajmą mi więcej miejsca w bazie wink.gif

@edit. Z tego co widzę to ten artykuł jest w oparciu o Zend_ACL ? Ale ja nie planuję używać frameworków, nigdy z nich nie korzystałem, nie wiem czy bym sobie z nimi poradził ...
!*!
Nie patrz że to jest w Zend pisane, chodzi o samo działanie ACL. A te składa się z trzech podstaw, roli czyli statusu odwiedzającego np. "gość, user, bot, moderator, admin", zasobu, czyli "dodaj artykuł, czytaj artykuł" i deklaracji dostępu do zasobu czyli "user ma prawa gościa i może czytać art, a moderator może go dodać".
W większości implementacji ACL, role dziedziczą po sobie w dół, a dzięki deklaracji, jakiś konkretny użytkownik może mieć prawa admina, ale tylko w jednym module np edycji wpisów. U Ciebie nie jest to możliwe, ponieważ ograniczasz się do IF 0-1, a to nie ma nic wspólnego z ACL.

Przemyśl to jeszcze raz dokładnie, bo w pewnym momencie z Twoim kodem możesz się zablokować ;)
Mefiuu
rozumiem (rozumiem ?):

Załóżmy, że mam takie role:

Użytkownik, Moderator, Admin (klasyczne role).

Jak to dalej rozegrać ? Trzymać w bazie obok loginu i hasła jego rolę ? Nie za bardzo mogę pojąć jak wtedy miałbym implementować dziedziczenie...

Właśnie, Ty tutaj mówisz o tym, że moje identyfikatory dostępów nie są jasne. Jak to wykonać ?

Poza tym w artykule też jest to rozegrane na IF'ach, tylko w nieco inny sposób niż u mnie wink.gif

  1. <?php
  2. // Zalozmy, ze uzytkownik ma role Moderator
  3. $userRole = "Moderator";
  4. if ( $acl->isAllowed($userRole, "Article", "edit") ) {
  5. echo "You are allowed to edit this article.";
  6. } else {
  7. echo "You aren’t allowed to edit this article.";
  8. }
  9. ?>


Jak to rozegrać (tak z grubsza) ?
!*!
  1. $role = array('user', 'moderator', 'admin');
  2. $acl->addRole($role);


A to skąd pobierzesz $role, to nie ma znaczenia wink.gif Po prostu umieść je w bazie jako kolejne rekordy w odpowiedniej tableli, bo może być ich klika, lub bardzo dużo. Rola użytkownika to tak jak piszesz, może być obok loginu, w końcu ona mało kiedy się zmienia i zazwyczaj jest pobierana przy logowaniu w sesję.

Cytat
Właśnie, Ty tutaj mówisz o tym, że moje identyfikatory dostępów nie są jasne. Jak to wykonać ?

Rozpracuj pierw ten kod na "plikach" tak jak tam jest, pomyśl nad tym jak on działa (wywal to z Zend, chodzi o same moduły i nazwy metod)

Cytat
Poza tym w artykule też jest to rozegrane na IF'ach, tylko w nieco inny sposób niż u mnie

Tylko że u Ciebie jest albo 0 albo 1 i to ogranicza działanie o którym wspomniałem.
Mefiuu
no okej. Czyli do tej pory to by wyglądało tak (jeśli dobrze myślę) :
Użytkownik "Mefiuu" ma prawa Moderatora (przy loginie w bazie ma wpisane że jest moderkiem).
Teraz, np. na stronie głównej ma mieć możliwość edytowania komentarzy, więc robię tak:

index.php

  1. $role = mysql_query // na szybko, pobieranie z bazy roli z tabeli login
  2.  
  3. $acl->addRole($role);


czyli mam określone w pliku index.php jaką kto ma rolę (jeśli się zaloguje admin to doda rolę admin, tak ?). Tylko jeszcze jedna rzecz: jak przetrzymywać w bazie uprawnienia i je pobierać żeby je sprawdzać ?
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.