FOSUserBundle - 初次登录时执行功能

时间:2017-11-15 11:39:50

标签: php symfony authentication login fosuserbundle

我有一个Symfony 3应用程序,通过FOSUserBundle进行用户管理。我想通过检查用户" last_login"来实现一个检查初始用户登录的Listener类。值。虽然我确实阅读了article on event subscribers,但我很难找到更新last_login值的确切时间。 是否有人有这样的知识,或者有人知道关于用户初次登录的更好方法吗?

2 个答案:

答案 0 :(得分:1)

我刚看了一眼,看来你可以使用eventSubscriber来订阅SecurityEvents :: INTERACTIVE_LOGIN事件,以获得你需要的位置。

class RegistrationSubscriber implements EventSubscriberInterface
{
private $tokenStorage;

public function __construct(TokenStorage $tokenStorage)
{
    $this->tokenStorage = $tokenStorage;
} 
 public static function getSubscribedEvents()
{
    return [
        SecurityEvents::INTERACTIVE_LOGIN => [
            ['lastLogin', 150],
        ],
    ];
}
public function lastLogin(InteractiveLoginEvent $event){
    $user = $this->tokenStorage->getToken()->getUser();
    if($user->getLastLogin() == null){
     //Do something
    }
}

在第一次登录时的测试中,$ user-> getLastLogin()为null,因此您可以在此处输入所需的任何逻辑。

答案 1 :(得分:1)

Symfony和FOSUserBundle有相关事件。甚至FOSUserBundle也有这些事件的事件订阅者

/**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::SECURITY_IMPLICIT_LOGIN => 'onImplicitLogin',
            SecurityEvents::INTERACTIVE_LOGIN => 'onSecurityInteractiveLogin',
        );
    }

您可以订阅这些活动并制作自己的逻辑。在symfony中没有初始登录这样的thibg,你需要自己管理。

订阅活动并尝试这样的事情:

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event){

    $user = $event->getAuthenticationToken()->getUser();
    //some logic to check the user
    if(!$user->getLastLogin()){
    //its my first login!!! do what ever you want here
    }else{
        //I have already logged before so just pass
    }
}

此外,您需要将您的订阅者优先级更改为-10或类似的内容,以便在FOSUserBundle之前捕获事件,或者您将始终通过。

希望有所帮助