Авторизация и аутентификация в PHP: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Авторизация и аутентификация в PHP: как защитить свой сайт

Безопасность — один из ключевых аспектов любого веб-приложения. В PHP аутентификация (проверка подлинности пользователя) и авторизация (определение его прав доступа) реализуются с помощью встроенных инструментов: сессий, cookies, хэширования паролей и работы с базами данных. В этой статье мы разберём полный цикл создания системы входа, регистрации и разграничения доступа на PHP.

1. Основные понятия

  • Аутентификация — процесс проверки, является ли пользователь тем, за кого себя выдаёт (обычно по логину и паролю).
  • Авторизация — проверка, имеет ли аутентифицированный пользователь право на выполнение определённого действия (например, доступ к админ-панели).
  • Сессия — временное хранилище данных на сервере, связанное с конкретным посетителем через уникальный идентификатор (session ID).
  • Хэширование паролей — преобразование пароля в необратимую строку для безопасного хранения в БД.

2. Регистрация пользователя

Первый шаг — создание формы регистрации и обработчика. Пароль никогда не хранится в открытом виде — используем функцию password_hash().

2.1. Форма регистрации (register.php)

<form method="post" action="register_handler.php">
    <input type="text" name="username" placeholder="Логин" required>
    <input type="email" name="email" placeholder="Email" required>
    <input type="password" name="password" placeholder="Пароль" required>
    <button type="submit">Зарегистрироваться</button>
</form>

2.2. Обработчик регистрации (register_handler.php)

<?php
// Подключение к БД (PDO)
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');

$username = $_POST['username'];
$email = $_POST['email'];
$password = password_hash($_POST['password'], PASSWORD_BCRYPT); // хэшируем

$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute([$username, $email, $password]);

header('Location: login.php');
?>

Используйте PASSWORD_BCRYPT — он автоматически генерирует соль и считается достаточно надёжным.

3. Аутентификация (вход в систему)

При входе мы сверяем введённый пароль с хэшем из базы данных с помощью password_verify() и создаём сессию.

3.1. Форма входа (login.php)

<form method="post" action="login_handler.php">
    <input type="text" name="username" placeholder="Логин" required>
    <input type="password" name="password" placeholder="Пароль" required>
    <button type="submit">Войти</button>
</form>

3.2. Обработчик входа (login_handler.php)

<?php
session_start();
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');

$username = $_POST['username'];
$password = $_POST['password'];

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();

if ($user && password_verify($password, $user['password'])) {
    // Аутентификация успешна
    $_SESSION['user_id'] = $user['id'];
    $_SESSION['username'] = $user['username'];
    $_SESSION['role'] = $user['role']; // для авторизации
    header('Location: dashboard.php');
} else {
    echo "Неверный логин или пароль";
}
?>

4. Авторизация (разграничение доступа)

После аутентификации пользователь получает роль (например, 'user', 'admin', 'moderator'). Авторизация проверяет эту роль перед выполнением действий.

4.1. Простая проверка роли

<?php
session_start();

// Проверяем, авторизован ли пользователь
if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}

// Проверяем роль
if ($_SESSION['role'] !== 'admin') {
    die("Доступ запрещён. Требуются права администратора.");
}

// Код для админ-панели
echo "Добро пожаловать, " . htmlspecialchars($_SESSION['username']);
?>

4.2.

Рекомендаций