Przejdź do głównej zawartości

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

RolaPoziomOpis
client0Klient / rodzic / uczeń. Dostęp do profilu i swoich danych.
employee1Pracownik / korepetytor. Zarządzanie klientami, uczniami, zaproszeniami.
admin2Administrator. 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

StronaWymagana rola
/login, /register itd.Brak (gość)
/dashboard/defaultZalogowany
/dashboard/profileclient
/dashboard/clientsemployee
/dashboard/clients/[id]employee
/dashboard/studentsemployee

Kontrola dostępu w API

EndpointMetodaWymagana rola
POST /api/invitationsPOSTemployee
GET /api/invitationsGETemployee
POST /api/onboardingPOSTZalogowany
GET /api/clients/[id]GETemployee lub właściciel
PATCH /api/clients/[id]PATCHemployee lub właściciel (ograniczone pola)
POST /api/clients/[id]/studentsPOSTemployee lub właściciel
PATCH /api/clients/students/[id]PATCHemployee 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 true jeśli poziom roli użytkownika ≥ wymagany poziom.
  • Zwraca false dla undefined, pustego stringa, lub nieznanej roli.