Улучшение работы кук
parent
87a7b4cf6b
commit
4965d9ddf6
|
@ -592,23 +592,52 @@ class ModuleUser extends Module
|
|||
* Ставим куку
|
||||
*/
|
||||
if ($bRemember) {
|
||||
setcookie('key', $sKey, time()+Config::Get('sys.cookie.time'), Config::Get('sys.cookie.path'), Config::Get('sys.cookie.host'), false, true);
|
||||
$this->SetUserKeyCookie($sKey);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Установка куки с ключом аутентификации
|
||||
*
|
||||
* @param string $sKey Ключ аутентификации
|
||||
* @param int|null $iExpires Время жизни куки
|
||||
*/
|
||||
protected function SetUserKeyCookie($sKey, $iExpires=null) {
|
||||
if (is_null($iExpires)) {
|
||||
$iExpires = time() + Config::Get('sys.cookie.time');
|
||||
}
|
||||
setcookie(
|
||||
'key',
|
||||
$sKey,
|
||||
[
|
||||
'expires' => $iExpires,
|
||||
'path' => Config::Get('sys.cookie.path'),
|
||||
'domain' => Config::Get('sys.cookie.host'),
|
||||
'secure' => Config::Get('sys.cookie.secure'),
|
||||
'httponly' => true,
|
||||
'samesite' => Config::Get('sys.cookie.samesite'),
|
||||
]
|
||||
);
|
||||
/**
|
||||
* Чтобы сохранять сессию живой, кука периодически ставится заново;
|
||||
* здесь хранится время последней установки
|
||||
*/
|
||||
$this->Session_Set('last_cookie_ping', time());
|
||||
}
|
||||
/**
|
||||
* Залогинивание по ключу аутентификации
|
||||
*
|
||||
*/
|
||||
protected function AutoLogin()
|
||||
{
|
||||
$sKeyFromCookies = getRequestStr('key', null, 'cookie');
|
||||
/**
|
||||
* Если есть живая php-сессия - информация из неё более приоритетна.
|
||||
* Если нет - попробуем залогиниться по ключу аутентификации из кук
|
||||
*/
|
||||
$sKey = $this->Session_Get('key');
|
||||
if (empty($sKey)) {
|
||||
$sKey = getRequestStr('key', null, 'cookie');
|
||||
$sKey = $sKeyFromCookies;
|
||||
}
|
||||
if (empty($sKey)) {
|
||||
return;
|
||||
|
@ -621,6 +650,18 @@ class ModuleUser extends Module
|
|||
if ($this->oUserCurrent) {
|
||||
if (!$this->ValidateUserKey($this->oUserCurrent, $sKey)) {
|
||||
$this->Logout();
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* Если есть кука - периодически ставим её заново, чтобы сессия
|
||||
* не слетала при активном посещении сайта
|
||||
*/
|
||||
$iPingInterval = Config::Get('sys.cookie.ping_interval');
|
||||
if ($iPingInterval > 0 && !empty($sKeyFromCookies)) {
|
||||
$iLastPing = $this->Session_Get('last_cookie_ping');
|
||||
if (!$iLastPing || time() - $iLastPing >= $iPingInterval) {
|
||||
$this->SetUserKeyCookie($sKeyFromCookies);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -664,15 +705,16 @@ class ModuleUser extends Module
|
|||
{
|
||||
$this->oUserCurrent=null;
|
||||
$this->oSession=null;
|
||||
/**
|
||||
* Дропаем куку
|
||||
*/
|
||||
$this->SetUserKeyCookie('', 1);
|
||||
/**
|
||||
* Дропаем из сессии
|
||||
*/
|
||||
$this->Session_Drop('user_id');
|
||||
$this->Session_Drop('key');
|
||||
/**
|
||||
* Дропаем куку
|
||||
*/
|
||||
setcookie('key', '', 1, Config::Get('sys.cookie.path'), Config::Get('sys.cookie.host'));
|
||||
$this->Session_Drop('last_cookie_ping');
|
||||
}
|
||||
/**
|
||||
* Обновление данных сессии
|
||||
|
|
|
@ -54,11 +54,13 @@ class ModuleSession extends Module
|
|||
protected function Start()
|
||||
{
|
||||
session_name(Config::Get('sys.session.name'));
|
||||
session_set_cookie_params(
|
||||
Config::Get('sys.session.timeout'),
|
||||
Config::Get('sys.session.path'),
|
||||
Config::Get('sys.session.host')
|
||||
);
|
||||
session_set_cookie_params([
|
||||
'lifetime' => Config::Get('sys.session.timeout'),
|
||||
'path' => Config::Get('sys.session.path'),
|
||||
'domain' => Config::Get('sys.session.host'),
|
||||
'secure' => Config::Get('sys.session.secure'),
|
||||
'samesite' => Config::Get('sys.session.samesite'),
|
||||
]);
|
||||
if (!session_id()) {
|
||||
/**
|
||||
* Попытка подменить идентификатор имени сессии через куку
|
||||
|
@ -98,9 +100,13 @@ class ModuleSession extends Module
|
|||
setcookie(
|
||||
Config::Get('sys.session.name'),
|
||||
$this->sId,
|
||||
time()+Config::Get('sys.session.timeout'),
|
||||
Config::Get('sys.session.path'),
|
||||
Config::Get('sys.session.host')
|
||||
[
|
||||
'expires' => time() + Config::Get('sys.session.timeout'),
|
||||
'path' => Config::Get('sys.session.path'),
|
||||
'domain' => Config::Get('sys.session.host'),
|
||||
'secure' => Config::Get('sys.session.secure'),
|
||||
'samesite' => Config::Get('sys.session.samesite'),
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,6 +70,9 @@ $config['smarty']['compile_check'] = true; // Проверять или нет
|
|||
$config['sys']['cookie']['host'] = null; // хост для установки куков
|
||||
$config['sys']['cookie']['path'] = '/'; // путь для установки куков
|
||||
$config['sys']['cookie']['time'] = 60 * 60 * 24 * 7; // время жизни куки когда пользователь остается залогиненым на сайте
|
||||
$config['sys']['cookie']['secure'] = false; // добавление атрибута Secure
|
||||
$config['sys']['cookie']['samesite'] = 'Lax'; // значение атрибута SameSite
|
||||
$config['sys']['cookie']['ping_interval'] = 60 * 60; // интервал периодического обновления куки аутентификации, чтобы она не слетала
|
||||
/**
|
||||
* Настройки сессий
|
||||
*/
|
||||
|
@ -77,6 +80,8 @@ $config['sys']['session']['name'] = 'TABUNSESSIONID'; // назван
|
|||
$config['sys']['session']['timeout'] = '___sys.cookie.time___'; // Тайм-аут сессии в секундах (тот же, что и в cookies)
|
||||
$config['sys']['session']['host'] = '___sys.cookie.host___'; // хост сессии в куках
|
||||
$config['sys']['session']['path'] = '___sys.cookie.path___'; // путь сессии в куках
|
||||
$config['sys']['session']['secure'] = '___sys.cookie.secure___';
|
||||
$config['sys']['session']['samesite'] = '___sys.cookie.samesite___';
|
||||
/**
|
||||
* Настройки почтовых уведомлений
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue