Урок 22
Защита страниц и права доступа
20 минЗачем защищать страницы?
Некоторые страницы должны быть доступны только авторизованным пользователям:
- Создание поста — только авторы
- Редактирование поста — только автор поста
- Админ-панель — только администраторы
Функции проверки доступа
Добавьте в includes/helpers.php:
/**
* Проверить, авторизован ли пользователь
*/
function isLoggedIn(): bool {
return isset($_SESSION["user_id"]);
}
/**
* Получить ID текущего пользователя
*/
function getCurrentUserId(): ?int {
return isset($_SESSION["user_id"]) ? (int)$_SESSION["user_id"] : null;
}
/**
* Получить имя текущего пользователя
*/
function getCurrentUsername(): ?string {
return $_SESSION["username"] ?? null;
}
/**
* Требовать авторизацию
* Если пользователь не авторизован — редирект на страницу входа
*/
function requireLogin(): void {
if (!isLoggedIn()) {
// Сохраняем URL, куда пользователь хотел попасть
$_SESSION["redirect_after_login"] = $_SERVER["REQUEST_URI"];
header("Location: /login.php");
exit;
}
}
/**
* Редирект после входа (на сохранённую страницу)
*/
function redirectAfterLogin(): void {
$redirect = $_SESSION["redirect_after_login"] ?? "index.php";
unset($_SESSION["redirect_after_login"]);
header("Location: " . $redirect);
exit;
}
Используем requireLogin()
Теперь любую страницу можно защитить одной строкой:
<?php
require_once "includes/config.php";
// Эта страница только для авторизованных!
requireLogin();
// ... остальной код страницы
?>
Если пользователь не авторизован, его перенаправит на страницу входа. После входа — вернёт на исходную страницу.
Обновляем login.php
Замените редирект после успешного входа:
// Было:
header("Location: index.php");
// Стало:
redirectAfterLogin();
Создаём страницу профиля
Создайте public/profile.php — пример защищённой страницы:
<?php
require_once "includes/config.php";
// Только для авторизованных
requireLogin();
// Получаем данные текущего пользователя
$user = getUserById(getCurrentUserId());
$page_title = "Мой профиль — $site_name";
include "includes/header.php";
?>
<h2>Мой профиль</h2>
<div style="background: #f9f9f9; padding: 20px; border-radius: 8px; max-width: 400px;">
<p><strong>Имя пользователя:</strong> <?= escape($user["username"]) ?></p>
<p><strong>Email:</strong> <?= escape($user["email"]) ?></p>
<p><strong>Дата регистрации:</strong> <?= formatDate($user["created_at"]) ?></p>
</div>
<p style="margin-top: 20px;">
<a href="index.php">← На главную</a>
</p>
<?php include "includes/footer.php"; ?>
Проверяем защиту
- Выйдите из системы
- Попробуйте открыть
http://localhost:8080/profile.php - Вас перенаправит на страницу входа
- Войдите в систему
- Вас автоматически вернёт на профиль!
Обновляем header с ссылкой на профиль
В includes/header.php добавьте ссылку:
<?php if (isLoggedIn()): ?>
Привет, <a href="profile.php" style="color: white;"><strong><?= escape(getCurrentUsername()) ?></strong></a>!
<a href="logout.php" style="color: white;">Выйти</a>
<?php else: ?>
<a href="login.php" style="color: white;">Войти</a> |
<a href="register.php" style="color: white;">Регистрация</a>
<?php endif; ?>
Проверка авторства
Добавьте в includes/helpers.php:
/**
* Проверить, является ли текущий пользователь автором поста
*/
function isPostAuthor(int $postUserId): bool {
return isLoggedIn() && getCurrentUserId() === $postUserId;
}
Использование на странице поста:
<?php if (isPostAuthor($post["user_id"])): ?>
<p>
<a href="edit_post.php?id=<?= $post["id"] ?>">Редактировать</a> |
<a href="delete_post.php?id=<?= $post["id"] ?>">Удалить</a>
</p>
<?php endif; ?>
Модуль 4 завершён!
Вы научились:
✅ Работать с сессиями
✅ Создавать регистрацию с валидацией
✅ Делать безопасный вход с хешированием
✅ Защищать страницы от неавторизованных
В следующем модуле создадим полноценное управление постами!
Вы научились:
✅ Работать с сессиями
✅ Создавать регистрацию с валидацией
✅ Делать безопасный вход с хешированием
✅ Защищать страницы от неавторизованных
В следующем модуле создадим полноценное управление постами!