Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Autoryzacja użytkowników - OOP
Forum PHP.pl > Forum > PHP > Object-oriented programming
tua1
Witam

Mam za zadanie skodzić mini CMS w php z użyciem obiektów, utknąłem na zarządzaniu użytkownikami.
Chciałbym stworzyć jakąś hierarchię klas, ale kompletnie nie mam pomyśłu jak się za to zabrać.
Szukałem coś po necie, ale zwykle kończyło się na jednej wielkiej klasie Users odpowiedzialnej za logowanie, dodawania nowych użytkowników, a taki sposób programowania jest nie w moim stylu, żeby wszystko pakować do jednej klasy.

Chciałbym, żeby po zainstalowaniu cms, były aktywne 2 typy użytkowników: Admin i Guest, przy czym admin może aktywować kolejne typy, np:

Regular - czyli użytkownika z możliwością rejestracji w serwisie, czy Editor, czyli kogoś do pisania artykułów na stronie. Każdy typ, użytkownika ma określone uprawnienia, chciałbym je zakodować na sztywno w klasach i używać do porównywania operacji bitowych, ale to chyba utrudni dodawania nowych uprawnień przez Admina.

Myślałem o dziedziczeniu, stworzyć abstrakcyjną klasę User z minimalnymi uprawnieniami i funkcjami dostępnymi dla wszystkich użytkowników, a później dziedziczyć po niej: AdminUser, RegularUser, GuestUser itd, a w klasie odpowiedzialnej za logowanie w zależności od pobranego z bazy typu użytkownika tworzyć obiekt określonej klasy, nie wiem czy to dobre rozwiązanie i czy to nie za dużo komplikacji, proszę o jakieś porady i sorry że tak dużo, ale utknąłem z projektem w martwym punkcie.

Pozdrawiam
wookieb
Moja osobista sugestia
- UserAuth - odpowiedzialna za przechowywanie danych aktualnie zalogowanego użytkownika
- AclPrivileges - Lista uprawnień dla roli aktualnie zalogowanego użytkownika. Egzemplarz tej klasy powinieneś przekazać do UserAuth

Jeżeli chodzi o budowanie uprawnień to już inna działka. Jeżeli nie chcesz działać na bazie danych to możesz to zrobić na plikach w dość prosty sposób.

Cytat
Myślałem o dziedziczeniu, stworzyć abstrakcyjną klasę User z minimalnymi uprawnieniami i funkcjami dostępnymi dla wszystkich użytkowników, a później dziedziczyć po niej: AdminUser, RegularUser, GuestUser itd, a w klasie odpowiedzialnej za logowanie w zależności od pobranego z bazy typu użytkownika tworzyć obiekt określonej klasy, nie wiem czy to dobre rozwiązanie i czy to nie za dużo komplikacji, proszę o jakieś porady i sorry że tak dużo, ale utknąłem z projektem w martwym punkcie.

Tyż tak można ale dla ułatwienia edycji to już lepiej pliki smile.gif
tua1
dzięki za odpowiedź, ciekawe propozycja, no i jest oop bo asocjacja:)

Do uprawnień, chyba przechowam je w bazie danych, tylko chciałbym ciągle zachować możliwość porównywania bitowego.

Mam taki pomysł, tabelka m.in z polami permission_name, permission_value no i value zwiększać *2 przy dodawaniu nowego uprawnienia. (Jakaś procedura czy coś)

Będzie ok?
wookieb
A opisy dokładniej jak chcesz zrealizować zapisywanie uprawnień z możliwością porównania bitowego?
tua1
Hmmy, no właśnie czepiłem się tych bitów no i teraz trzeba z tego wybrnąć.

Do zarządzania uprawnieniami stworzyłbym klasę Permissions, która pobiera m.in wszystkie dostępne
uprawnienia (obiekty klasy Permission) i zapisuje je w tablicy.

  1. //w klasie Permissions, pobieranie wszystkich uprawnień przy tworzeniu obiektu
  2. private function getPermissions() {
  3. //pobieranie danych z bazy
  4. while ($row = mysql_fetch_assoc($result)) {
  5. Permission p = new Permission($row['id'], $row['permission_name'], $row[permission_value']);
  6. $this->permissions["$row['id']"] = p;
  7. }
  8. }
  9.  
  10. public getPermission($id) {
  11. return $this->permissions["$id"];
  12. }


W klasie autoryzującej użytkowników, czy określających jakiś moduł strony, mający posiadać uprawnienia, pobrac id uprawnien z bazy danych
np. dla danego typu użytkownika i na tej podstawie utworzyć:

  1. $this->permissions |= Permissions::getInstance()->getPermission("$row['id']")->getPermissionValue();


Dalej przechować id użytkownika w sesji, tworzyć obiekt reprezentujący użytkownika i sprawdzać możliwość dostępu do modułu porównując przywileje.

  1. //W klasie reprezentującej moduły strony
  2. function checkPermissions($userPermissions, $elementPermissions) {
  3. if($userPermissions & $elementPermissions) {
  4. return true;
  5. } else {
  6. return false;
  7. }
  8. }


Jest późna pora i jestem trochę nie kumaty nic lepszego nie przychodzi mi do głowy na tą chwilę.

Pozdrawiam
wookieb
Nie do końca rozumiem, jak porównujesz "permissiony" ale jeżeli działa to ok:)
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.