Files
web_work/includes/auth.php
kirill.khorkov 29b9aaac50 Исправление багов авторизации, корзины и админки
- Исправлено выпадающее меню профиля (hover-баг с margin-top)
- Исправлена авторизация: правильные пути к API (api/auth.php)
- Исправлены ссылки на админку (admin/index.php вместо admin_panel.php)
- Исправлены пути API корзины в catalog.php и checkout.php
- Добавлена форма добавления/редактирования товаров в админке
- Исправлены кнопки +/- в корзине (улучшена обработка AJAX)
- Исправлена регистрация: правильные пути и обработка boolean в PostgreSQL
- Добавлена миграция для назначения прав админа пользователю admin@mail.ru
- Удален тестовый блок 'Быстрый вход' для неавторизованных пользователей
- Улучшена обработка ошибок во всех API-эндпоинтах
2025-12-16 02:58:44 +03:00

149 lines
4.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Функции авторизации для AETERNA
*/
require_once __DIR__ . '/../config/database.php';
/**
* Авторизация пользователя
*/
function loginUser(string $email, string $password): array {
$db = Database::getInstance()->getConnection();
try {
$stmt = $db->prepare("
SELECT user_id, email, password_hash, full_name, phone, city, is_admin, is_active
FROM users WHERE email = ?
");
$stmt->execute([$email]);
$user = $stmt->fetch();
if (!$user) {
return ['success' => false, 'message' => 'Пользователь не найден'];
}
if (!$user['is_active']) {
return ['success' => false, 'message' => 'Аккаунт заблокирован'];
}
if (!password_verify($password, $user['password_hash'])) {
return ['success' => false, 'message' => 'Неверный пароль'];
}
// Сохраняем в сессию
$_SESSION['user_id'] = $user['user_id'];
$_SESSION['user_email'] = $user['email'];
$_SESSION['full_name'] = $user['full_name'];
$_SESSION['user_phone'] = $user['phone'] ?? '';
$_SESSION['user_city'] = $user['city'] ?? '';
$_SESSION['isLoggedIn'] = true;
$_SESSION['isAdmin'] = (bool)$user['is_admin'];
$_SESSION['login_time'] = time();
// Обновляем время последнего входа
$updateStmt = $db->prepare("UPDATE users SET last_login = CURRENT_TIMESTAMP WHERE user_id = ?");
$updateStmt->execute([$user['user_id']]);
return ['success' => true, 'user' => $user];
} catch (PDOException $e) {
return ['success' => false, 'message' => 'Ошибка базы данных'];
}
}
/**
* Регистрация нового пользователя
*/
function registerUser(array $data): array {
$db = Database::getInstance()->getConnection();
$email = trim($data['email'] ?? '');
$password = $data['password'] ?? '';
$fullName = trim($data['full_name'] ?? '');
$phone = trim($data['phone'] ?? '');
$city = trim($data['city'] ?? '');
// Валидация
if (empty($email) || empty($password) || empty($fullName)) {
return ['success' => false, 'message' => 'Заполните все обязательные поля'];
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return ['success' => false, 'message' => 'Некорректный email'];
}
if (strlen($password) < 6) {
return ['success' => false, 'message' => 'Пароль должен содержать минимум 6 символов'];
}
try {
// Проверяем существование пользователя
$checkStmt = $db->prepare("SELECT user_id FROM users WHERE email = ?");
$checkStmt->execute([$email]);
if ($checkStmt->fetch()) {
return ['success' => false, 'message' => 'Пользователь с таким email уже существует'];
}
// Создаем пользователя
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $db->prepare("
INSERT INTO users (email, password_hash, full_name, phone, city, is_active)
VALUES (?, ?, ?, ?, ?, TRUE)
RETURNING user_id
");
$stmt->execute([$email, $passwordHash, $fullName, $phone, $city]);
$userId = $stmt->fetchColumn();
// Автоматически авторизуем
$_SESSION['user_id'] = $userId;
$_SESSION['user_email'] = $email;
$_SESSION['full_name'] = $fullName;
$_SESSION['user_phone'] = $phone;
$_SESSION['user_city'] = $city;
$_SESSION['isLoggedIn'] = true;
$_SESSION['isAdmin'] = false;
$_SESSION['login_time'] = time();
return ['success' => true, 'user_id' => $userId];
} catch (PDOException $e) {
return ['success' => false, 'message' => 'Ошибка базы данных: ' . $e->getMessage()];
}
}
/**
* Выход пользователя
*/
function logoutUser(): void {
$_SESSION = [];
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
}
/**
* Проверка является ли пользователь администратором
*/
function checkAdminAccess(): bool {
if (!isset($_SESSION['isLoggedIn']) || $_SESSION['isLoggedIn'] !== true) {
return false;
}
if (!isset($_SESSION['isAdmin']) || $_SESSION['isAdmin'] !== true) {
return false;
}
return true;
}