Урок 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"; ?>

Проверяем защиту

  1. Выйдите из системы
  2. Попробуйте открыть http://localhost:8080/profile.php
  3. Вас перенаправит на страницу входа
  4. Войдите в систему
  5. Вас автоматически вернёт на профиль!

Обновляем 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 завершён!

Вы научились:
✅ Работать с сессиями
✅ Создавать регистрацию с валидацией
✅ Делать безопасный вход с хешированием
✅ Защищать страницы от неавторизованных

В следующем модуле создадим полноценное управление постами!

Мы используем файлы cookie для улучшения работы сайта и персонализации контента. Продолжая использовать сайт, вы соглашаетесь с использованием cookies в соответствии с нашей Политикой конфиденциальности.