99 lines
3.6 KiB
PHP
99 lines
3.6 KiB
PHP
<?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
|
||
{
|
||
// Ничего не делаем после запроса
|
||
}
|
||
}
|