/** * Создание пользовательской сессии * * @param ModuleUser_EntityUser $oUser Объект пользователя * @param string $sKey Сессионный ключ * @return bool */ protected function CreateSession(ModuleUser_EntityUser $oUser, $sKey = null) { /** * Генерим новый ключ */ if (is_null($sKey)) { $sKey = md5(func_generator() . time() . $oUser->getId()); } /** * Проверяем ключ сессии */ if ($oSession = $this->oMapper->GetSessionByKey($sKey)) { /** * Если сессия уже не активна, то удаляем её */ if (!$oSession->isActive()) { $this->oMapper->DeleteSession($oSession); unset($oSession); } } if (!isset($oSession)) { /** * Проверяем количество активных сессий у пользователя и завершаем сверх лимита */ $iCountMaxSessions = Config::Get('module.user.count_auth_session'); $aSessions = $this->GetSessionsByUserId($oUser->getId()); $aSessions = array_slice($aSessions, $iCountMaxSessions - 1 < 0 ? 0 : $iCountMaxSessions - 1); foreach ($aSessions as $oSessionOld) { $oSessionOld->setDateClose(date("Y-m-d H:i:s")); $this->oMapper->UpdateSession($oSessionOld); } /** * Проверяем количество всех сессий у пользователя и удаляем сверх лимита */ $iCountMaxSessions = Config::Get('module.user.count_auth_session_history'); $aSessions = $this->GetSessionsByUserId($oUser->getId(), false); $aSessions = array_slice($aSessions, $iCountMaxSessions - 1 < 0 ? 0 : $iCountMaxSessions - 1); foreach ($aSessions as $oSessionOld) { $this->oMapper->DeleteSession($oSessionOld); } } $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('user_session_update')); $this->Cache_Delete("user_session_{$oUser->getId()}"); /** * Создаем новую или обновляем данные у старой */ if (!isset($oSession)) { $oSession = Engine::GetEntity('User_Session'); $oSession->setKey($sKey); $oSession->setIpCreate(func_getIp()); $oSession->setDateCreate(date("Y-m-d H:i:s")); $oSession->setExtraParam('user_agent', isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''); } $oSession->setUserId($oUser->getId()); $oSession->setIpLast(func_getIp()); $oSession->setDateLast(date("Y-m-d H:i:s")); if ($this->oMapper->CreateSession($oSession)) { $this->oSession = $oSession; return true; } return false; }