2015-05-13 31 views
1

我試圖手動登錄使用這段代碼的用戶(當然驗證的登錄數據後)工作原理:TYPO3的 - 手動登錄只有餅乾

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

非常感謝您提前!

回答

0

網站提供HTTP(S),這是一個無狀態協議。這意味着東西必須保存在客戶端計算機上,否則服務器無法再可靠地識別用戶。有幾種方法可以做到這一點:

  • 使用會話cookie(的方式TYPO3這樣做,PHP也確實是)
  • 手動添加會話ID每個請求的網頁上,基於Java的應用程序做有時候。如果用戶離開頁面並稍後返回(在同一個會話中,或者在另一個標籤中沒有複製鏈接),這會中斷。
  • 可能有一些更多的方法,但我不能拿出他們現在

所以我的回答是:因爲我相信這是很難得到TYPO3切換到設置會話的另一種方式信息(會非常不友好的用戶),沒有好辦法避免設置cookie。

但是:
該cookie是一個會話cookie,當瀏覽器會話結束時會過期。因此,關閉瀏覽器並重新打開它應該會結束登錄,,除了,如果瀏覽器在打開時恢復之前的會話。許多現代瀏覽器都這樣做,尤其是移動瀏覽器。方法要解決的是:

  • 使用瀏覽器
  • 設置瀏覽器的隱身或私密模式啓動一個新的會話的每個啓動,並確保當你完成(再次瀏覽器中終止:手錶手機設備)。
1

在一些TYPO3 6.2.x中(我不記得X完全一致)有推出了變化,這會導致你需要自己打電話AbstractUserAuthentication::setSessionCookie()方法......不幸的是,有protected訪問使登錄用戶的最佳方式是創建一些擴展它的util類:

typo3conf/your_ext/Classes/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登錄你的用戶,你只需要創建這個類的fe_user$uid的新對象作爲構造函數的PARAM:

$this->objectManager->get(
    '\VendorName\YourExt\Utils\FeuserAuthentication', 
    $user->getUid() 
); 

附:正如你所看到的,這個班級不檢查帳戶是否存在和/或是否已啓用,所以你需要在驗證嘗試之前自行檢查。