TYPO3 fe_user如何通过php代码登录用户?

问题描述 投票:1回答:4

我有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代码登录用户吗?

typo3
4个回答
3
投票

对于$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);
}
//...

1
投票

使用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), "/");
}

0
投票

也许你错过了一个$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();

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.