28

ユーザーが正常にログインした後、一連のアクションを実行する必要があります。これには、データベースからのデータのロードとセッションへの保存が含まれます。

これを実装するための最良のアプローチは何ですか?

4

2 に答える 2

54

security.interactive_loginイベントにリスナーを追加できます。

リスナーをそのようにアタッチします。この例では、セキュリティ コンテキストとセッションも依存関係として渡します。

注: SecurityContext は Symfony 2.6 で非推奨になりました。http://symfony.com/blog/new-in-symfony-2-6-security-component-improvementsを参照して

parameters:
   # ...

   account.security_listener.class: Company\AccountBundle\Listener\SecurityListener

services:
   # ...

   account.security_listener:
        class: %account.security_listener.class%
        arguments: ['@security.context', '@session']
        tags:
            - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }

リスナーには、セッションで必要なものを何でも保存できます。この場合、ユーザーのタイムゾーンを設定します。

<?php

namespace Company\AccountBundle\Listener;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

class SecurityListener
{

   public function __construct(SecurityContextInterface $security, Session $session)
   {
      $this->security = $security;
      $this->session = $session;
   }

   public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
   {
        $timezone = $this->security->getToken()->getUser()->getTimezone();
        if (empty($timezone)) {
            $timezone = 'UTC';
        }
        $this->session->set('timezone', $timezone);
   }

}
于 2012-06-24T19:25:52.817 に答える