Урок 26

Роли пользователей — админ и обычный

25 мин

Зачем нужны роли?

Сейчас все пользователи равны. Но в реальном блоге нужны разные уровни доступа:

  • Гость — может только читать
  • Пользователь — может создавать и редактировать свои посты
  • Админ — может всё: редактировать чужие посты, удалять пользователей, управлять сайтом

Шаг 1: Добавляем поле role в базу

Откройте phpMyAdmin (localhost:8081), выберите базу blog, таблицу users.

Перейдите во вкладку "SQL" и выполните:

ALTER TABLE users ADD COLUMN role VARCHAR(20) DEFAULT "user" AFTER password;

Теперь у каждого пользователя есть поле role. По умолчанию — "user".

Шаг 2: Делаем первого админа

Выполните SQL:

UPDATE users SET role = "admin" WHERE username = "admin";

Теперь пользователь admin — администратор.

Шаг 3: Функции проверки роли

Добавьте в includes/helpers.php:

/**
 * Проверить, является ли пользователь админом
 */
function isAdmin(): bool {
    if (!isLoggedIn()) {
        return false;
    }
    
    return isset($_SESSION["role"]) && $_SESSION["role"] === "admin";
}

/**
 * Требовать права админа
 */
function requireAdmin(): void {
    requireLogin();
    
    if (!isAdmin()) {
        header("HTTP/1.0 403 Forbidden");
        echo "<h1>Доступ запрещён</h1>";
        echo "<p>Эта страница доступна только администраторам.</p>";
        exit;
    }
}

Шаг 4: Сохраняем роль в сессии

Обновите login.php — при входе сохраняем роль:

// В блоке успешного входа:
$_SESSION["user_id"] = $user["id"];
$_SESSION["username"] = $user["username"];
$_SESSION["role"] = $user["role"];  // Добавляем эту строку

Шаг 5: Обновляем права на редактирование

Обновите функцию isPostAuthor в helpers.php:

/**
 * Проверить, может ли пользователь редактировать пост
 * (автор или админ)
 */
function canEditPost(int $postUserId): bool {
    if (!isLoggedIn()) {
        return false;
    }
    
    // Админ может редактировать всё
    if (isAdmin()) {
        return true;
    }
    
    // Автор может редактировать свой пост
    return getCurrentUserId() === $postUserId;
}

И обновите проверки в edit_post.php и delete_post.php:

// Было:
if (!isPostAuthor($post["user_id"])) {

// Стало:
if (!canEditPost($post["user_id"])) {

Шаг 6: Показываем статус в шапке

В header.php:

<?php if (isLoggedIn()): ?>
    <?php if (isAdmin()): ?>
        <a href="admin/" style="color: #ffc107; margin-right: 15px;">Админка</a>
    <?php endif; ?>
    Привет, <?= escape(getCurrentUsername()) ?>
    <?php if (isAdmin()): ?>
        <span style="color: #ffc107;">(админ)</span>
    <?php endif; ?>
<?php endif; ?>

Проверяем

  1. Выйдите и войдите заново под admin
  2. В шапке должно появиться "(админ)" и ссылка на админку
  3. Админ может редактировать чужие посты
Роли работают!
В следующем уроке создадим админ-панель.

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