2012-06-06 18 views
5

¿Hay alguna manera de almacenar cuándo fue la última vez que un usuario inició sesión?Symfony2 Inicio de sesión y seguridad

Estoy usando symfony2, y todo está funcionando bien con la configuración de seguridad.

He visto esto Security and login on a Symfony 2 based project, que es una pregunta similar, pero simplemente no se ajusta a mis necesidades.

¿Hay alguna otra solución?

+0

¿Puede decirnos por qué no se ajusta a sus necesidades? ¿Qué más necesitarías hacer? Los servicios definitivamente serían mi elección para algo como esto ... –

Respuesta

15

Puede crear un AuthenticationHandler que Symfony llamará cuando el usuario inicie sesión con éxito, puede guardar el tiempo de inicio de sesión en una propiedad de entidad User (suponiendo que tenga este escenario).

En primer lugar, crear el manejador de la autenticación de éxito:

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

Luego hay que registrar el manejador de la autenticación como servicio en un archivo de configuración, por ejemplo, src/Acme/TestBundle/resources/Config/services.yml

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

y configurar el inicio de sesión formulario para utilizar el controlador creado, consulte su security.yml

form_login: 
    success_handler: authentication_handler 

Obviamente, para que esto funcione, debe tener una entidad User con una propiedad loginTime y el colocador correspondiente. Y necesita configurar el inicio de sesión para usar el repositorio de entidad User como proveedor de usuario y el DaoAuthenticationProvider, como se explica aquí: http://symfony.com/doc/current/book/security.html#loading-users-from-the-database.

+0

Te perdiste la llamada 'persist()' en el controlador antes de 'flush()' –

+1

Mmmm ... No creo que 'persist()' sea necesario ya que el objeto 'Usuario' obtenido a través del repositorio' Usuario' ya está gestionado por el Gestor de entidades de Doctrine. Consulte este http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork.html#how-doctrine-keeps-track-of-objects. – eagleoneraptor

+0

En su ejemplo, redirige al usuario a la ruta 'login_success'. Estoy usando 'target_path_parameter' en mi formulario de inicio de sesión. ¿Cómo puedo redirigir al usuario a la página que estaba a punto de ir (no sé si es la página de administración, la página del producto, etc.)? –

5

Una solución bastante simple sería implementar FOSUserBundle en su aplicación ya que cada entrada de usuario en la base de datos tiene (entre otras cosas) un campo "last_login".

Cuestiones relacionadas