bp/app/Filters/AuthFilter.php

99 lines
3.6 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
namespace App\Filters;
use App\Controllers\Auth;
use App\Models\UserModel;
use App\Models\OrganizationUserModel;
use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
/**
* AuthFilter - Фильтр аутентификации с поддержкой Remember Me
*
* Проверяет авторизацию пользователя двумя способами:
* 1. По сессии (стандартный способ)
* 2. По remember-токену из cookies (если сессия отсутствует)
*
* Если пользователь не авторизован — редирект на /login.
*
* Применяется к маршрутам, которые требуют авторизации, но НЕ требуют
* выбранной организации (например, профиль, выбор организации).
*/
class AuthFilter implements FilterInterface
{
/**
* Проверка аутентификации перед обработкой запроса
*
* @param RequestInterface $request
* @param array|null $arguments
* @return ResponseInterface|void
*/
public function before(RequestInterface $request, $arguments = null)
{
$session = session();
// Если пользователь уже авторизован по сессии — пропускаем
if ($session->get('isLoggedIn')) {
return;
}
// Проверяем remember-токен
$userId = Auth::checkRememberToken();
if ($userId !== null) {
// Токен найден и валиден — восстанавливаем сессию
$userModel = new UserModel();
$user = $userModel->find($userId);
if ($user && $user['email_verified']) {
$orgUserModel = new OrganizationUserModel();
$userOrgs = $orgUserModel->where('user_id', $user['id'])->findAll();
if (!empty($userOrgs)) {
// Восстанавливаем данные сессии
$sessionData = [
'user_id' => $user['id'],
'email' => $user['email'],
'name' => $user['name'],
'isLoggedIn' => true,
];
// Выбираем организацию если она была
if (count($userOrgs) === 1) {
$sessionData['active_org_id'] = $userOrgs[0]['organization_id'];
}
$session->set($sessionData);
log_message('info', "User {$user['email']} logged in via remember token");
return;
}
}
// Токен недействителен — удаляем его
$response = service('response');
$response->deleteCookie('remember_selector');
$response->deleteCookie('remember_token');
}
// Пользователь не авторизован — редирект на логин
return redirect()->to('/login');
}
/**
* Обработка после выполнения запроса
*
* @param RequestInterface $request
* @param ResponseInterface $response
* @param array|null $arguments
* @return void
*/
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null): void
{
// Ничего не делаем после запроса
}
}