Model logowania mam zrobiony w prostu sposób:
Kod
bool login($login, $password);
Loguje użytkownika o podanym loginie i zwraca efekt operacji (wtedy można te dane również odpowiednio zapisać w sesji/ciasteczkach).
Kod
void logout();
Wiadomo.
Kod
bool isLogged();
Sprawdza, czy obiekt reprezentuje zalogowanego użytkownika.
Kod
bool hasAccess(AccessLevel $access);
Sprawdza uprawnienia.
Kod
int getLoggedID();
ID zalogowanego użytkownika (rzuca wyjątkiem, gdy użytkownik nie jest zalogowany).
A to, jak on jest reprezentowany w bazie danych, czy przez jedną, dwie, czy sto tabel, można łatwo zmienić w implementacji. Jeśli chodzi o mnie zazwyczaj stosuję users -> groups -> masks (AccessLevel to klasa trzymająca reguły dostępu, zazwyczaj po prostu lista wymaganych masek). Używałem tego schematu w przeróżnych przypadkach i sprawdza się.
Zazwyczaj implementuje go w klasie użytkownika tak, że jest od razu reprezentowany przez użytkownika w bazie danych, ale w razie potrzeby nie ma przeszkód wyodrębnienia tego mechanizmu do osobnej klasy, jeśli nasz model przechowywania danych nie spina tych wszystkich danych i nie pokrywa się.