2012-06-06 7 views
5

ユーザが最後にログインしたときに保存できる方法はありますか?Symfony2ログインとセキュリティ

私はsymfony2を使用していますが、すべてセキュリティ設定で問題なく動作しています。

これはよく似た質問ですが、これは私のニーズに合っていません。これはSecurity and login on a Symfony 2 based projectです。

他に解決策はありますか?

+0

あなたのニーズに合わない理由を教えてください。他に何をする必要がありますか?サービスは間違いなくあなたはフラッシュ '前ハンドラで'存続() 'の呼び出し()' –

答えて

15

ユーザログインに成功したときにsymfonyが呼び出すAuthenticationHandlerを作成すると、Userエンティティプロパティにログイン時間を保存できます(このシナリオがあると仮定します)。

まず、成功の認証ハンドラの作成:次に、あなたは、たとえば、設定ファイル内のサービスとしてsrc/Acme/TestBundle/resources/Config/services.yml

services: 
    authentication_handler: 
     class: Acme\TestBundle\Handler\AuthenticationHandler 
     calls: 
      - [ setContainer, [ @service_container ] ] 

を認証ハンドラを登録し、ログインを設定する必要が

namespace Acme\TestBundle\Handler; 

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\DependencyInjection\ContainerAware; 

class AuthenticationHandler extends ContainerAware implements AuthenticationSuccessHandlerInterface 
{ 
    function onAuthenticationSuccess(Request $request, TokenInterface $token) 
    { 
     $token->getUser()->setLoginTime(new \DateTime()); 
     $this->container->get('doctrine')->getEntityManager()->flush(); 

     return new RedirectResponse($this->container->get('router')->generate('login_success')); 
    } 
} 

を作成したハンドラを使用するフォームをチェックアウトしてください。security.yml

form_login: 
    success_handler: authentication_handler 

明らかに、これが機能するには、loginTimeプロパティと対応するセッターを持つUserエンティティが必要です。また、ユーザプロバイダとしてUserエンティティリポジトリを使用し、ここで説明するDaoAuthenticationProviderを使用するログインを設定する必要があります。http://symfony.com/doc/current/book/security.html#loading-users-from-the-database

+0

...このような何かのための私のピックだろう...私は ')('持続必要であるとは思いません'User'オブジェクトは' User'リポジトリを介して取得されているので、既にDoctrineエンティティマネージャによって管理されています。 http://docs.doctrine-project.org/projects/doctrine-orm/ja/latest/reference/unitofwork.html#how-doctrine-keeps-track-of-objectsを確認してください。 –

+1

うーんを逃した – eagleoneraptor

+0

あなたの例では、ユーザーを 'login_success'パスにリダイレクトします。私はログインフォームに 'target_path_parameter'を使用しています。彼がやっていたページにユーザーをリダイレクトするにはどうすればいいですか(私はそれが管理ページ、製品ページなのかどうかわかりません)? '$要求 - >要求 - >(「target_path_parameter」)を取得': –

5

非常に簡単な解決策は、データベース内の各ユーザーエントリは、(とりわけ)「last_login」フィールドを持っているとして、あなたのアプリケーションでFOSUserBundleを実装することであろう。

関連する問題