Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Autoryzacja użytkowników - OOP
tua1
post
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.10.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował tua1 11.12.2009, 00:24:26
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
tua1
post
Post #3





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.10.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A opisy dokładniej jak chcesz zrealizować zapisywanie uprawnień z możliwością porównania bitowego?
Go to the top of the page
+Quote Post
tua1
post
Post #5





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.10.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Nie do końca rozumiem, jak porównujesz "permissiony" ale jeżeli działa to ok:)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 28.09.2025 - 13:44