Przejdź do głównej zawartości

Autoryzacja i role użytkowników

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).

AspektAutentykacjaAutoryzacja
PytanieKim jestes?Co możesz robić?
KolejnoscPierwszaDruga
WeryfikujeTozsamoscUprawnienia
PrzykładLogowanieDostep do panelu admina

Nazwany zestaw uprawnien przypisany użytkownikowi:

  • admin - pełny dostep
  • moderator - zarzadzanie tresciami
  • user - podstawowy dostep
  • guest - tylko odczyt

Konkretna akcja, która użytkownik może wykonac:

  • posts.create - tworzenie postow
  • posts.edit - edycja postow
  • users.delete - usuwanie użytkowników

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] │
│ │
└─────────────────────────────────────────────────────────────┘

Uprawnienia przypisane bezposrednio do użytkownika dla konkretnych zasobow:

┌─────────────────────────────────────────────────────────────┐
│ ACL - Per Resource │
├─────────────────────────────────────────────────────────────┤
│ │
│ Dokument "raport.pdf": │
│ - Jan: read, write │
│ - Anna: read │
│ - Piotr: brak dostepu │
│ │
└─────────────────────────────────────────────────────────────┘
-- Tabela użytkowników
CREATE 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 dane
INSERT INTO users (username, password_hash, role) VALUES
('admin', '$2y$10$...', 'admin'),
('jan', '$2y$10$...', 'editor'),
('anna', '$2y$10$...', 'user');
<?php
session_start();
// Funkcja sprawdzajaca role
function 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życie
if (!hasRole('editor')) {
http_response_code(403);
die('Brak uprawnien do tej strony');
}
middleware/auth.php
<?php
function 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.php
require_once 'middleware/auth.php';
requireRole('admin');
// Kod strony admina...
<?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 kodzie
if (can('posts.delete')) {
echo '<button>Usun post</button>';
}
// Użycie w kontrolerze
function deletePost($postId) {
if (!can('posts.delete')) {
throw new ForbiddenException('Brak uprawnien');
}
// Logika usuwania...
}
<!-- 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>
<?php
// Sprawdzenie na poziomie wyswietlania I przetwarzania
if ($_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; ?>
RolaOpisTypowe uprawnienia
Super AdminPełna kontrolaWszystko + zarzadzanie adminami
AdminAdministratorCRUD wszystkich zasobow
ModeratorModeracja tresciEdycja/usuniecie tresci innych
EditorTwórca tresciCRUD własnych tresci
UserZwykły użytkownikOdczyt + ograniczona edycja
GuestNiezalogowanyTylko odczyt publicznych
<?php
// ZLE - tylko ukrywanie w UI
if ($user->role === 'admin') {
echo '<button onclick="deleteUser()">Usun</button>';
}
// Atakujacy może bezposrednio wywołać deleteUser()
// DOBRZE - weryfikacja przy akcji
function deleteUser($userId) {
if (!can('users.delete')) {
http_response_code(403);
return ['error' => 'Forbidden'];
}
// Faktyczne usuwanie...
}
  • 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