Autoryzacja i role użytkowników
Wprowadzenie
Dział zatytułowany „Wprowadzenie”Autoryzacja to proces weryfikacji uprawnien użytkownika - odpowiada na pytanie “Co możesz robić?”. Nastepuje PO autentykacji (weryfikacji tozsamosci) i okresla, do jakich zasobow użytkownik ma dostep.
Przykład z zycia: wejscie do biurowca wymaga karty dostepu (autentykacja), ale karta może dawac dostep tylko do wybranych pieter (autoryzacja).
Kluczowe pojecia
Dział zatytułowany „Kluczowe pojecia”Autentykacja vs Autoryzacja
Dział zatytułowany „Autentykacja vs Autoryzacja”| Aspekt | Autentykacja | Autoryzacja |
|---|---|---|
| Pytanie | Kim jestes? | Co możesz robić? |
| Kolejnosc | Pierwsza | Druga |
| Weryfikuje | Tozsamosc | Uprawnienia |
| Przykład | Logowanie | Dostep do panelu admina |
Rola (Role)
Dział zatytułowany „Rola (Role)”Nazwany zestaw uprawnien przypisany użytkownikowi:
- admin - pełny dostep
- moderator - zarzadzanie tresciami
- user - podstawowy dostep
- guest - tylko odczyt
Uprawnienie (Permission)
Dział zatytułowany „Uprawnienie (Permission)”Konkretna akcja, która użytkownik może wykonac:
posts.create- tworzenie postowposts.edit- edycja postowusers.delete- usuwanie użytkowników
Modele kontroli dostepu
Dział zatytułowany „Modele kontroli dostepu”RBAC (Role-Based Access Control)
Dział zatytułowany „RBAC (Role-Based Access Control)”Najpopularniejszy model - uprawnienia przypisane do rol:
┌─────────────────────────────────────────────────────────────┐│ RBAC - Role-Based │├─────────────────────────────────────────────────────────────┤│ ││ UZYTKOWNIK ──► ROLA ──► UPRAWNIENIA ││ ││ Jan ──► admin ──► [create, read, update, delete] ││ Anna ──► editor ──► [create, read, update] ││ Piotr ──► viewer ──► [read] ││ │└─────────────────────────────────────────────────────────────┘ACL (Access Control List)
Dział zatytułowany „ACL (Access Control List)”Uprawnienia przypisane bezposrednio do użytkownika dla konkretnych zasobow:
┌─────────────────────────────────────────────────────────────┐│ ACL - Per Resource │├─────────────────────────────────────────────────────────────┤│ ││ Dokument "raport.pdf": ││ - Jan: read, write ││ - Anna: read ││ - Piotr: brak dostepu ││ │└─────────────────────────────────────────────────────────────┘Implementacja w PHP
Dział zatytułowany „Implementacja w PHP”Struktura bazy danych
Dział zatytułowany „Struktura bazy danych”-- Tabela użytkownikówCREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password_hash VARCHAR(255) NOT NULL, role VARCHAR(20) DEFAULT 'user');
-- Przykładowe daneINSERT INTO users (username, password_hash, role) VALUES('admin', '$2y$10$...', 'admin'),('jan', '$2y$10$...', 'editor'),('anna', '$2y$10$...', 'user');Sprawdzanie roli w kodzie
Dział zatytułowany „Sprawdzanie roli w kodzie”<?phpsession_start();
// Funkcja sprawdzajaca rolefunction hasRole($requiredRole) { if (!isset($_SESSION['user_role'])) { return false; }
$roleHierarchy = [ 'admin' => 3, 'editor' => 2, 'user' => 1, 'guest' => 0 ];
$userLevel = $roleHierarchy[$_SESSION['user_role']] ?? 0; $requiredLevel = $roleHierarchy[$requiredRole] ?? 0;
return $userLevel >= $requiredLevel;}
// Użycieif (!hasRole('editor')) { http_response_code(403); die('Brak uprawnien do tej strony');}Middleware autoryzacji
Dział zatytułowany „Middleware autoryzacji”<?phpfunction requireRole($role) { session_start();
// Sprawdz czy zalogowany if (!isset($_SESSION['user_id'])) { header('Location: /login.php'); exit; }
// Sprawdz role if (!hasRole($role)) { http_response_code(403); include '403.php'; exit; }}
// Użycie na stronie admina// admin/dashboard.phprequire_once 'middleware/auth.php';requireRole('admin');
// Kod strony admina...System uprawnien (permissions)
Dział zatytułowany „System uprawnien (permissions)”<?php// Definicja uprawnien dla rol$permissions = [ 'admin' => ['users.create', 'users.edit', 'users.delete', 'posts.create', 'posts.edit', 'posts.delete'], 'editor' => ['posts.create', 'posts.edit', 'posts.delete'], 'user' => ['posts.create', 'posts.edit_own'], 'guest' => ['posts.read']];
function can($permission) { global $permissions; $role = $_SESSION['user_role'] ?? 'guest';
return in_array($permission, $permissions[$role] ?? []);}
// Użycie w kodzieif (can('posts.delete')) { echo '<button>Usun post</button>';}
// Użycie w kontrolerzefunction deletePost($postId) { if (!can('posts.delete')) { throw new ForbiddenException('Brak uprawnien'); } // Logika usuwania...}Autoryzacja w widokach
Dział zatytułowany „Autoryzacja w widokach”Warunkowe wyswietlanie elementow
Dział zatytułowany „Warunkowe wyswietlanie elementow”<!-- Nawigacja z ukrywaniem elementow --><nav> <a href="/">Strona główna</a>
<?php if (isset($_SESSION['user_id'])): ?> <a href="/profile">Moj profil</a>
<?php if (hasRole('editor')): ?> <a href="/posts/create">Nowy post</a> <?php endif; ?>
<?php if (hasRole('admin')): ?> <a href="/admin">Panel admina</a> <?php endif; ?>
<a href="/logout">Wyloguj</a> <?php else: ?> <a href="/login">Zaloguj</a> <?php endif; ?></nav>Ochrona formularzy
Dział zatytułowany „Ochrona formularzy”<?php// Sprawdzenie na poziomie wyswietlania I przetwarzaniaif ($_SERVER['REQUEST_METHOD'] === 'POST') { // Ponowna weryfikacja przy zapisie (nie ufaj tylko UI) if (!can('posts.edit')) { die('Brak uprawnien'); } // Zapisz zmiany...}?>
<?php if (can('posts.edit')): ?><form method="post"> <input type="text" name="title" value="<?= $post['title'] ?>"> <button type="submit">Zapisz</button></form><?php else: ?><p>Nie masz uprawnien do edycji</p><?php endif; ?>Typowe role w aplikacjach
Dział zatytułowany „Typowe role w aplikacjach”| Rola | Opis | Typowe uprawnienia |
|---|---|---|
| Super Admin | Pełna kontrola | Wszystko + zarzadzanie adminami |
| Admin | Administrator | CRUD wszystkich zasobow |
| Moderator | Moderacja tresci | Edycja/usuniecie tresci innych |
| Editor | Twórca tresci | CRUD własnych tresci |
| User | Zwykły użytkownik | Odczyt + ograniczona edycja |
| Guest | Niezalogowany | Tylko odczyt publicznych |
Najczestsze błędy
Dział zatytułowany „Najczestsze błędy”<?php// ZLE - tylko ukrywanie w UIif ($user->role === 'admin') { echo '<button onclick="deleteUser()">Usun</button>';}// Atakujacy może bezposrednio wywołać deleteUser()
// DOBRZE - weryfikacja przy akcjifunction deleteUser($userId) { if (!can('users.delete')) { http_response_code(403); return ['error' => 'Forbidden']; } // Faktyczne usuwanie...}Podsumowanie
Dział zatytułowany „Podsumowanie”- Autoryzacja sprawdza uprawnienia (po autentykacji)
- Role grupuja uprawnienia (admin, editor, user)
- RBAC to najpopularniejszy model kontroli dostepu
- Zawsze sprawdzaj uprawnienia na serwerze, nie tylko w UI
- Użytkownik może być zalogowany, ale nie mieć uprawnien
- Ukrywanie elementow UI to nie ochrona
OWASP Access Control Najlepsze praktyki kontroli dostepu
RBAC Wikipedia Teoria RBAC
Laravel Authorization Przykład implementacji w frameworku