user profile
This commit is contained in:
@@ -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: Убрать перед релизом!
|
||||
|
||||
Reference in New Issue
Block a user