2012-06-06 74 views
5

有没有一种方法可以保存用户最后一次登录的时间?Symfony2登录和安全

我正在使用symfony2,并且所有的工作都可以通过安全配置正常工作。

我看过这个Security and login on a Symfony 2 based project,这是一个类似的问题,但它不符合我的需要。

有没有其他解决方案?

+0

你能告诉我们为什么它不符合你的需求吗?你还需要做什么?服务肯定会是我的选择这样的事情... –

回答

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属性和相应的设置器。而你需要配置为使用User实体库为用户提供与DaoAuthenticationProvider登录,如下解释:http://symfony.com/doc/current/book/security.html#loading-users-from-the-database

+0

你错过了'留存()'调用的处理程序之前'的flush()' –

+1

嗯......我不认为'坚持()'是必要的因为通过'User'存储库获得的'User'对象已经由Doctrine实体管理器管理。检查此http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork.html#how-doctrine-keeps-track-of-objects。 – eagleoneraptor

+0

在您的示例中,您将用户重定向到'login_success'路径。我在登录表单中使用'target_path_parameter'。我如何将用户重定向到他即将访问的页面(我不知道它是否为管理页面,产品页面等)? –

5

一个很简单的解决办法是实现在应用程序FOSUserBundle为数据库中的每个用户条目有(其中包括)一个“LAST_LOGIN”字段。