<?php
namespace AppBundle\Handler;
use AppBundle\Common\LoginToolkit;
use Biz\Role\Util\PermissionBuilder;
use Biz\User\Service\TokenService;
use Biz\User\Service\UserService;
use Doctrine\Bundle\DoctrineBundle\Registry as Doctrine;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Topxia\Service\Common\ServiceKernel;
/**
* Custom login listener.
*/
class LoginSuccessHandler
{
/**
* @var AuthorizationChecker
*/
private $checker;
/**
* Constructor.
*
* @param AuthorizationChecker $checker
* @param Doctrine $doctrine
*/
public function __construct(AuthorizationChecker $checker)
{
$this->checker = $checker;
}
/**
* Do the magic.
*
* @param InteractiveLoginEvent $event
*/
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
if ($this->checker->isGranted('IS_AUTHENTICATED_FULLY')) {
// user has just logged in
}
if ($this->checker->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
// user has logged in using remember_me cookie
}
// do some other magic here
$user = $event->getAuthenticationToken()->getUser();
$user->setPermissions(PermissionBuilder::instance()->findPermissionsByRoles($user->getRoles()));
$request = $event->getRequest();
$sessionId = $request->getSession()->getId();
$request->getSession()->set('loginIp', $request->getClientIp());
$this->getUserService()->markLoginInfo();
$this->getUserService()->rememberLoginSessionId($user['id'], $sessionId);
$this->getUserService()->markLoginSuccess($user['id'], $request->getClientIp());
$this->getUserService()->updateUserLocale($user['id'], $request->getLocale());
$this->destroyAppLoginToken($user['id']);
}
protected function destroyAppLoginToken($userId)
{
if (LoginToolkit::isLimit()) {
$this->getTokenService()->deleteTokenByTypeAndUserId('mobile_login', $userId);
}
}
/**
* @return TokenService
*/
protected function getTokenService()
{
return $this->createService('User:TokenService');
}
/**
* @return UserService
*/
private function getUserService()
{
return $this->createService('User:UserService');
}
protected function createService($name)
{
return ServiceKernel::instance()->createService($name);
}
}