Я пытаюсь вручную войти в систему пользователя с помощью этого фрагмента (после проверки данных входа в систему, конечно):
public function loginUser($user) {
$userArray = array('uid' => $user->getUid());
$GLOBALS['TSFE']->fe_user->is_permanent = true;
$GLOBALS['TSFE']->fe_user->checkPid = 0;
$GLOBALS['TSFE']->fe_user->createUserSession($userArray);
$GLOBALS['TSFE']->fe_user->user = $GLOBALS['TSFE']->fe_user->fetchUserSession();
$GLOBALS['TSFE']->fe_user->fetchGroupData();
$GLOBALS['TSFE']->loginUser = true;
//this somehow forces a cookie to be set
$GLOBALS['TSFE']->fe_user->setAndSaveSessionData('dummy', TRUE);
}
Если я пропущу часть «setAndSaveSessionData», вход в систему не будет работать вообще, после перенаправления страницы данные для входа исчезнут, и пользователь снова выйдет из системы. Но setAndSaveSessionData сохраняет сессию в файле cookie, и пользователь останется в системе даже после закрытия браузера — такое поведение я не хочу (не без согласия пользователя). Есть ли способ, чтобы вручную войти в систему пользователя без «setAndSaveSessionData» часть? Я использую Typo3 6.2.12 с extbase и felogin
Заранее большое спасибо!
В некоторых TYPO3 6.2.x (я не помню, какой Икс точно) было внесено изменение, которое вызывает то, что вам нужно позвонить AbstractUserAuthentication::setSessionCookie()
метод сам … к сожалению, он имеет protected
access, так что лучший способ авторизовать пользователя — создать некоторый класс утилит, расширяющий его:
typo3conf / your_ext / Классы / Utils / FeuserAuthentication.php
<?php
namespace VendorName\YourExt\Utils;
use TYPO3\CMS\Core\Authentication\AbstractUserAuthentication;
use TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication;
class FeuserAuthentication extends AbstractUserAuthentication {
function __construct($uid) {
return $this->authByUid($uid);
}
// Authenticates user by uid
public function authByUid($uid) {
/** @var $fe_user FrontendUserAuthentication */
$fe_user = $GLOBALS['TSFE']->fe_user;
$fe_user->createUserSession(array('uid' => $uid));
$fe_user->user = $fe_user->getRawUserByUid($uid);
$fe_user->fetchGroupData();
$GLOBALS['TSFE']->loginUser = true;
$fe_user->setSessionCookie();
return $fe_user->isSetSessionCookie();
}
}
поэтому для входа в систему вашего пользователя с помощью uid вам просто нужно создать новый объект этого класса с $uid
из fe_user
как параметр конструктора:
$this->objectManager->get(
'\VendorName\YourExt\Utils\FeuserAuthentication',
$user->getUid()
);
Постскриптум Как видите, этот класс не проверяет, существует ли учетная запись и / или включена, поэтому вам нужно проверить ее самостоятельно перед попыткой аутентификации.
Веб-сайт доставляется HTTP (S), который является протоколом без сохранения состояния. Это означает, что что-то должен быть сохранен на клиентском компьютере, так как в противном случае сервер не сможет снова надежно распознать пользователя. Есть несколько способов сделать это:
Итак, мой ответ: поскольку я считаю, что TYPO3 трудно переключиться на другой способ установки информации о сеансе (это было бы весьма недружелюбно для пользователя), нет хорошего способа избежать установки cookie.
Тем не мение:
Файл cookie является файлом cookie сеанса, срок действия которого истекает после завершения сеанса браузера. Поэтому закрытие браузера и повторное его открытие должны завершить вход в систему, Кроме если браузер восстанавливает предыдущую сессию при открытии. Это делают многие современные браузеры, особенно мобильные. Способы обойти это: