0

我创建了一个security.authentication.success事件监听器,它应该在登录成功时向日志发送一行。现在每次加载防火墙后的页面时,我都会在日志中收到成功登录消息。如果我尝试使用

if ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY'))
{
    $logger->info('Successful login by ' . $username);
}

我陷入了递归的疯狂(xdebug 在 10000 次嵌套调用后抱怨,或者我设置的任何高)。

有没有办法检查用户是否刚刚登录,或者他是否正在使用活动会话?

注意:我使用的是 Symfony 2.2 (dev-master)

4

2 回答 2

1

您必须使用security.interactive_login

namespace Acme\UserBundle\Listener;

use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\Security\Core\SecurityContext;
use Doctrine\Bundle\DoctrineBundle\Registry as Doctrine; // for Symfony 2.1.x
// use Symfony\Bundle\DoctrineBundle\Registry as Doctrine; // for Symfony 2.0.x

/**
 * Custom login listener.
 */
class LoginListener
{
    /** @var \Symfony\Component\Security\Core\SecurityContext */
    private $securityContext;

    /** @var \Doctrine\ORM\EntityManager */
    private $em;

    /**
     * Constructor
     * 
     * @param SecurityContext $securityContext
     * @param Doctrine        $doctrine
     */
    public function __construct(SecurityContext $securityContext, Doctrine $doctrine)
    {
        $this->securityContext = $securityContext;
        $this->em              = $doctrine->getEntityManager();
    }

    /**
     * Do the magic.
     * 
     * @param  Event $event
     */
    public function onSecurityInteractiveLogin(Event $event)
    {
        if ($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
            // user has just logged in
        }

        if ($this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
            // user has logged in using remember_me cookie
        }

        // do some other magic here
        $user = $this->securityContext->getToken()->getUser();

        // ...
    }
}
于 2012-12-11T23:52:27.487 回答
0

从文档中:

security.interactive_login 事件在用户主动登录您的网站后触发。将此操作与非交互式身份验证方法区分开来很重要,例如:

  • 基于“记住我”cookie 的身份验证。
  • 基于您的会话的身份验证。
  • 使用 HTTP 基本或 HTTP 摘要标头进行身份验证。

例如,您可以监听 security.interactive_login 事件,以便在您的用户每次登录时给他们一条欢迎消息。

每次激活 switch_user 防火墙监听器时都会触发 security.switch_user 事件。

http://symfony.com/doc/current/components/security/authentication.html#security-events

于 2016-10-26T18:21:03.473 回答