由于我必须以某种方式验证登录数据,普通登录扩展无法处理,我必须开发一个自定义登录表单。此登录框是分机的一部分。用extbase写的。
但我坚持一个基本问题:如何在 extbase 中处理 fe_users 会话?
我写了这个函数,也许它有帮助:
/** @var $fe_user tslib_feUserAuth */
$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 = 1;
它的灵感来自Tx_Phpunit_Framework::loginFrontEndUser($userId):
// Instead of passing the actual user data to createUserSession, we
// pass an empty array to improve performance (e.g. no session record
// will be written to the database).
$GLOBALS['TSFE']->fe_user->createUserSession(array());
$GLOBALS['TSFE']->fe_user->user = $GLOBALS['TSFE']->fe_user->getRawUserByUid($userId);
$GLOBALS['TSFE']->fe_user->fetchGroupData();
$GLOBALS['TSFE']->loginUser = 1;
在 TYPO3 6.2 中,提供的答案似乎都不适合我。该修复在 Forge 中的错误报告中进行了描述,https ://forge.typo3.org/issues/62194 。基本上,SessionCookie 不再自动放置,您现在需要自己做,添加
$reflection = new \ReflectionClass($GLOBALS['TSFE']->fe_user);
$setSessionCookieMethod = $reflection->getMethod('setSessionCookie');
$setSessionCookieMethod->setAccessible(TRUE);
$setSessionCookieMethod->invoke($GLOBALS['TSFE']->fe_user);
在调用 createUserSession() 之后。
我终于做到了,通过结合大量的片段。这对我来说是这样的:
$loginData = array(
'uname' => $loginData['user'],
'uident' => $loginData['passw'],
'status' => 'login'
);
$GLOBALS['TSFE']->fe_user->checkPid = 0;
$info = $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$user = $GLOBALS['TSFE']->fe_user->fetchUserRecord( $info['db_user'], $loginData['uname'] );
if ( $GLOBALS['TSFE']->fe_user->compareUident($user,$loginData) )
{
$GLOBALS["TSFE"]->fe_user->user = $GLOBALS["TSFE"]->fe_user->fetchUserSession();
$GLOBALS['TSFE']->loginUser = 1;
$GLOBALS['TSFE']->fe_user->fetchGroupData();
$GLOBALS['TSFE']->fe_user->start();
$GLOBALS["TSFE"]->fe_user->createUserSession($user);
$GLOBALS["TSFE"]->fe_user->loginSessionStarted = TRUE;
}