Role i uprawnienia
Przegląd
Aplikacja implementuje system kontroli dostępu oparty na rolach (RBAC) z trzema poziomami. Role są hierarchiczne — wyższa rola zawiera uprawnienia niższej.
Role
| Rola | Poziom | Opis |
|---|---|---|
client | 0 | Klient / rodzic / uczeń. Dostęp do profilu i swoich danych. |
employee | 1 | Pracownik / korepetytor. Zarządzanie klientami, uczniami, zaproszeniami. |
admin | 2 | Administrator. Pełny dostęp + zarządzanie użytkownikami. |
Hierarchia
admin (2) > employee (1) > client (0)
Użytkownik z rolą admin przechodzi kontrolę hasRole(user.role, ROLES.EMPLOYEE) ✅
Użytkownik z rolą client przechodzi kontrolę hasRole(user.role, ROLES.EMPLOYEE) ❌
Kontrola dostępu na stronach
| Strona | Wymagana rola |
|---|---|
/login, /register itd. | Brak (gość) |
/dashboard/default | Zalogowany |
/dashboard/profile | client |
/dashboard/clients | employee |
/dashboard/clients/[id] | employee |
/dashboard/students | employee |
Kontrola dostępu w API
| Endpoint | Metoda | Wymagana rola |
|---|---|---|
POST /api/invitations | POST | employee |
GET /api/invitations | GET | employee |
POST /api/onboarding | POST | Zalogowany |
GET /api/clients/[id] | GET | employee lub właściciel |
PATCH /api/clients/[id] | PATCH | employee lub właściciel (ograniczone pola) |
POST /api/clients/[id]/students | POST | employee lub właściciel |
PATCH /api/clients/students/[id] | PATCH | employee lub właściciel |
Implementacja
Middleware (edge)
Sprawdza obecność cookie sesji — lekka walidacja na brzegu (edge):
- Nie weryfikuje roli (brak dostępu do bazy na edge).
- Chroni trasy
/dashboard/*przed niezalogowanymi. - Przekierowuje zalogowanych z tras gościa.
API routes
Pełna walidacja sesji + roli:
const session = await auth.api.getSession({ headers: await headers() });
if (!session?.user || !hasRole(session.user.role, ROLES.EMPLOYEE)) {
return NextResponse.json({ error: "Unauthorized" }, { status: 403 });
}
Funkcja hasRole()
function hasRole(userRole: string | undefined, requiredRole: Role): boolean
- Zwraca
truejeśli poziom roli użytkownika ≥ wymagany poziom. - Zwraca
falsedlaundefined, pustego stringa, lub nieznanej roli.