5

ユーザーが最後にログインしたのはいつかを保存する方法はありますか?

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

このSecurity and login on a Symfony 2 based project を見たことがありますが、これは同様の質問ですが、私のニーズには合いません。

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

4

2 に答える 2

15

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

まず、成功認証ハンドラーを作成します。

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'));
    }
}

次に、構成ファイルで認証ハンドラーをサービスとして登録する必要があります。たとえば、src/Acme/TestBundle/resources/Config/services.yml

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

作成したハンドラーを使用するようにログイン フォームを構成し、security.yml

form_login:
    success_handler: authentication_handler

明らかに、これが機能するには、プロパティと対応するセッターを持つUserエンティティが必要です。また、エンティティ リポジトリをユーザー プロバイダーとしてloginTime使用するようにログインを構成する必要があります。UserDaoAuthenticationProvider

于 2012-06-06T22:17:15.583 に答える
5

非常に簡単な解決策は、アプリケーションにFOSUserBundleを実装することです。これは、データベースの各ユーザー エントリに (とりわけ) "last_login" フィールドがあるためです。

于 2012-06-07T10:11:51.643 に答える