我有TYPO3 7.6.18和扩展femanager。
$GLOBALS['TSFE']->fe_user->checkPid = '';
$info = $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$user = $GLOBALS['TSFE']->fe_user->fetchUserRecord($info['db_user'], $username);
$loginData = array('uname' => $username, 'uident' => $password, 'status' => 'login');
$GLOBALS['TSFE']->fe_user->forceSetCookie = TRUE;
$GLOBALS['TSFE']->fe_user->createUserSession($user);
$GLOBALS['TSFE']->fe_user->user = $GLOBALS['TSFE']->fe_user->fetchUserSession();
$loginSuccess = $GLOBALS['TSFE']->fe_user->compareUident($user, $loginData);
这段代码不起作用。错误:
PHP Catchable Fatal Error: Argument 2 passed to In2code\Femanager\Utility\LogUtility::log() must be an instance of In2code\Femanager\Domain\Model\User, boolean given, called in /home/abenteuer/public_html/typo3conf/ext/feusersplus/Classes/Controller/NewController.php on line 91 and defined in /home/abenteuer/public_html/typo3conf/ext/femanager/Classes/Utility/LogUtility.php line 48
这是硬代码吗?可能存在更好的方式?
你知道如何通过PHP代码登录用户吗?
对于$loginData['uname']
我使用电子邮件作为用户名,您可以使用自己的用户名更改它($user->getUsername()
);
Class StandardLogin:
<?php
namespace Ads\Adsmanager\Authentication\Login;
/**
* Standard Login of users
*
* @author Andrei Todorut <[email protected]>
*/
class StandardLogin extends \TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication implements LoginInterface
{
/**
*
* @param \Ads\Adsmanager\Domain\Model\User $user
* @return boolean
*/
public function login(\Ads\Adsmanager\Domain\Model\User $user)
{
$passwordProcessor = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Saltedpasswords\\Salt\\PhpassSalt');
$loginData = array(
'uname' => $user->getEmail(), //usernmae
'uident' => $user->getPassword(), //password
'status' => 'login'
);
$this->checkPid = false;
$info = $this->getAuthInfoArray();
$info['db_user']['username_column'] = 'email';
$user_db = $this->fetchUserRecord($info['db_user'], $loginData['uname']);
if ($user_db && $passwordProcessor->checkPassword($user->getPassword(), $user_db['password'])) {
$this->setSession($user_db);
return true;
}
return false;
}
private function setSession($user_db)
{
$GLOBALS['TSFE']->fe_user->createUserSession($user_db);
$GLOBALS['TSFE']->fe_user->user = $user_db;
$GLOBALS['TSFE']->fe_user->setKey('ses', 'fe_typo_user', $user_db);
}
}
你的动作控制器:
<?php
//...
//stuff
public function loginAction(\TYPO3\CMS\Extbase\Domain\Model\User $user)
{
$login = new StandardLogin();
$login->login($user);
}
//...
使用username作为参数调用它
function loginUser($username)
{
$GLOBALS['TSFE']->fe_user->checkPid = '';
$info = $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$user = $GLOBALS['TSFE']->fe_user->fetchUserRecord($info['db_user'], $username);
$loginData = array('uname' => $username, 'uident' => $user['password'], 'status' => 'login');
$GLOBALS['TSFE']->fe_user->forceSetCookie = TRUE;
$GLOBALS['TSFE']->fe_user->createUserSession($user);
$reflection = new \ReflectionClass($GLOBALS['TSFE']->fe_user);
$setSessionCookieMethod = $reflection->getMethod('setSessionCookie');
$setSessionCookieMethod->setAccessible(TRUE);
$setSessionCookieMethod->invoke($GLOBALS['TSFE']->fe_user);
$GLOBALS['TSFE']->fe_user->user = $GLOBALS['TSFE']->fe_user->fetchUserSession();
$session_data = $GLOBALS['TSFE']->fe_user->fetchUserSession();
$loginSuccess = $GLOBALS['TSFE']->fe_user->compareUident($user, $loginData);
setcookie('fe_typo_user', $session_data['ses_id'], time() + (86400 * 30), "/");
setcookie('nc_staticfilecache', 'fe_typo_user_logged_in', time() + (86400 * 30), "/");
}
也许你错过了一个$GLOBALS['TSFE']->fe_user->fetchGroupData();
和一个$GLOBALS["TSFE"]->fe_user->storeSessionData();
来保存这些变化。
我只有一个旧的(TYPO3 4.5)示例,它的工作原理:
$user = $GLOBALS['TSFE']->fe_user->getRawUserByName($username);
$GLOBALS['TSFE']->fe_user->createUserSession($user);
$GLOBALS["TSFE"]->fe_user->user = $GLOBALS["TSFE"]->fe_user->fetchUserSession();
$GLOBALS['TSFE']->fe_user->fetchGroupData();
$GLOBALS["TSFE"]->fe_user->setKey("ses", "do_redirect", 0);
$GLOBALS["TSFE"]->fe_user->storeSessionData();
Typo3最近更改了它的Cookie策略,默认情况下不创建fe_typo_user(由于GDPR / DSGVO)。其他解决方案因为错过了“start()”而不再有效。
以下功能按预期工作:
public function loginUser($username, $password)
{
$loginData = array(
'uname' => $username,
'uident_text' => $password,
'status' => 'login'
);
$GLOBALS['TSFE']->fe_user->checkPid = 0;
$info = $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$userAuth = $this->objectManager->get(FrontendUserAuthentication::class);
$user = $userAuth->fetchUserRecord($info['db_user'], $loginData['uname']);
if ($user) {
$userAuth->checkPid = false;
$isValidLoginData = $this->saltedPasswordService->compareUident($user, $loginData);
if (!$isValidLoginData) {
return false;
} else {
$GLOBALS['TSFE']->fe_user->forceSetCookie = TRUE;
$GLOBALS['TSFE']->fe_user->dontSetCookie = false;
$GLOBALS['TSFE']->fe_user->start();
$GLOBALS['TSFE']->fe_user->createUserSession($user);
$GLOBALS['TSFE']->fe_user->setAndSaveSessionData('dummy', TRUE);
$GLOBALS['TSFE']->fe_user->loginUser = 1;
return true;
}
} else {
return false;
}
}
它缺乏严肃的状态处理。如果我进一步改进它,可以在这里找到:https://gist.github.com/tserowski/8572c2314f7f909f31248a9ad0023509