簡體   English   中英

Symfony3,設置用戶上次登錄日期

[英]Symfony3, set user last login date

我有一個簡單的登錄表單:

public function loginAction(Request $request)
{
    $authenticationUtils = $this->get('security.authentication_utils');

    // get the login error if there is one
    $error = $authenticationUtils->getLastAuthenticationError();

    // last username entered by the user
    $lastUsername = $authenticationUtils->getLastUsername();

    return $this->render(
        'users/login.html.twig',
        [
            'page' => 'login',
            'last_username' => $lastUsername,
            'error'         => $error,
        ]
    );
}

security.yml:

secured_area:
     form_login:
        provider: user_db_provider
        login_path: /login
        check_path: /login
        csrf_token_generator: security.csrf.token_manager

我正在嘗試設置用戶的上次登錄時間。

我是否真的必須創建一個新的監聽器並編寫一個完整的類,就像這個答案一樣 ,僅針對這條指令: $user->setLastLogin(new \\DateTime()); 或者是否有更簡單的東西,比如把它放在控制器中?

是的,您必須創建登錄成功偵聽器,如本答案中所述 ,並使用onAuthenticationSuccess方法存儲您的用戶信息。

您發布的代碼用於生成登錄頁面本身。 任何登錄操作都由防火牆處理,防火牆調用成功或失敗監聽器。 您可以在自定義偵聽器中執行代碼(例如,設置上次成功登錄timestsamp)。

原因是創建執行單個任務的類更好,而不是將大量代碼放在一個類中。 這樣可以保持代碼的模塊性,可擴展性和可維護性。

好吧,在Symfony 4我使用另一種方法,因為我的項目中沒有FOSUserBundle而且我不喜歡使用onAuthenticationSuccess每次調用的原因

(..)注意 - 如果您有基於會話的身份驗證(...),此事件(onAuthenticationSuccess)將在每個請求上觸發

檢查用戶的身份驗證(請參閱此安全身份驗證部分 )。 我知道可以使用security.interactive_login EventListener(更好的方法),但由於其他原因,我更喜歡上面的步驟。

所以我在SecurityController上創建了一個簡單的路由來檢查和更新User-> lastLogin屬性。

// /config/packages/security.yaml
security:
    firewalls:
        main:
        pattern: ^/
        user_checker: App\Security\UserChecker
        form_login:
            provider: my_db_provider
            login_path: login
            check_path: login
            always_use_default_target_path: true
            default_target_path: check_last_login
            csrf_token_generator: security.csrf.token_manager

這里, always_use_default_target_path: truedefault_target_path: check_last_login是鍵always_use_default_target_path:true強制目標, check_last_login實際用戶登錄時重定向的路由名稱

// /src/Controller/SecurityController.php
/**
 * @param Request $request
 * @Route("/check-last-login", name="check_last_login")
 * @param Request $request
 * @return Response
 *
 */
public function checkLastLogin(Request $request)
{
    /* @var $user User */
    if (!$user = $this->getUser()) {
        // redirect to somewhere to show some message
        throw new someAuthenticationException();
    }
    if ($user->getLastLogin() == null) {
        // Do something when is the first login
        return $this->redirectToRoute('complete-register');
    }
    $user->setLastLogin(new \DateTime());
    $oManager = $this->getDoctrine()->getManager();
    $oManager->persist($user);
    $oManager->flush();
    // 
    return $this->forward('App\Controller\DefaultController::index', array($request));
}

forward()可以替換為

// almost the time $providerKey is 'main' - see your firewalls entries
$providerKey = 'main';
$targetPath = $request->getSession()->get('_security.'.$providerKey.'.target_path');
$this->redirect($targetPath);

但請記住,這可能是注銷路線 ,因此您需要避免成功登錄,然后注銷

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM