user profile

This commit is contained in:
root
2026-01-13 07:11:21 +03:00
parent 24ea8deeec
commit 3d39c1ba07
12 changed files with 1312 additions and 47 deletions
+75
View File
@@ -345,6 +345,14 @@ class Auth extends BaseController
'isLoggedIn' => true
];
// === ЗАПОМНИТЬ МЕНЯ ===
$remember = $this->request->getPost('remember');
if ($remember) {
$this->createRememberToken($user['id']);
// Устанавливаем сессию на 30 дней
$this->session->setExpiry(30 * 24 * 60 * 60); // 30 дней в секундах
}
// АВТОМАТИЧЕСКИЙ ВЫБОР ОРГАНИЗАЦИИ
if (count($userOrgs) === 1) {
// Если одна организация — заходим автоматически для удобства
@@ -397,11 +405,78 @@ class Auth extends BaseController
public function logout()
{
$userId = session()->get('user_id');
// Удаляем все remember-токены пользователя
if ($userId) {
$db = \Config\Database::connect();
$db->table('remember_tokens')->where('user_id', $userId)->delete();
}
session()->destroy();
session()->remove('active_org_id');
return redirect()->to('/');
}
/**
* Создание remember-токена для автологина
*/
protected function createRememberToken(int $userId): void
{
$selector = bin2hex(random_bytes(16));
$validator = bin2hex(random_bytes(32));
$tokenHash = hash('sha256', $validator);
$expiresAt = date('Y-m-d H:i:s', strtotime('+30 days'));
$db = \Config\Database::connect();
$db->table('remember_tokens')->insert([
'user_id' => $userId,
'selector' => $selector,
'token_hash' => $tokenHash,
'expires_at' => $expiresAt,
'created_at' => date('Y-m-d H:i:s'),
'user_agent' => $this->request->getUserAgent()->getAgentString(),
'ip_address' => $this->request->getIPAddress(),
]);
// Устанавливаем cookie на 30 дней
$cookie = \Config\Services::response()->setCookie('remember_selector', $selector, 30 * 24 * 60 * 60);
$cookie = \Config\Services::response()->setCookie('remember_token', $validator, 30 * 24 * 60 * 60);
}
/**
* Проверка remember-токена (вызывается перед фильтрами авторизации)
* Возвращает user_id если токен валиден, иначе null
*/
public static function checkRememberToken(): ?int
{
$request = \Config\Services::request();
$selector = $request->getCookie('remember_selector');
$validator = $request->getCookie('remember_token');
if (!$selector || !$validator) {
return null;
}
$db = \Config\Database::connect();
$token = $db->table('remember_tokens')
->where('selector', $selector)
->where('expires_at >', date('Y-m-d H:i:s'))
->get()
->getRowArray();
if (!$token) {
return null;
}
$tokenHash = hash('sha256', $validator);
if (!hash_equals($token['token_hash'], $tokenHash)) {
return null;
}
return (int) $token['user_id'];
}
/**
* DEBUG: Просмотр состояния rate limiting (только для разработки)
* DELETE: Убрать перед релизом!