0

security.authentication.successログイン成功時にログに行を送信するイベントリスナーを作成しました。ファイアウォールの背後にあるページをロードするたびに、ログにログイン成功メッセージが表示されます。使ってみたら

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

私は再帰的な狂気に陥ります(10000回のネストされた呼び出しの後にxdebugが不平を言う、または私が設定した高さに関係なく)。

ユーザーがログインしたばかりか、アクティブなセッションを使用しているかを確認する方法はありますか?

注: 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 イベントは、ユーザーが Web サイトに積極的にログインした後にトリガーされます。このアクションを、次のような非対話型認証方法と区別することが重要です。

  • 「remember me」Cookie に基づく認証。
  • セッションに基づく認証。
  • HTTP 基本ヘッダーまたは HTTP ダイジェスト ヘッダーを使用した認証。

たとえば、ユーザーがログインするたびにウェルカム フラッシュ メッセージを表示するために、security.interactive_login イベントをリッスンできます。

security.switch_user イベントは、switch_user ファイアウォール リスナーをアクティブにするたびにトリガーされます。

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

于 2016-10-26T18:21:03.473 に答える