2012-06-06 7 views
5

사용자가 마지막으로 로그인 한 시간을 저장할 수있는 방법이 있습니까?Symfony2 로그인 및 보안

저는 symfony2를 사용하고 있으며 모든 것이 보안 설정과 함께 올바르게 작동합니다.

이 질문에 대한 답변은 Security and login on a Symfony 2 based project인데, 내 질문에 맞지 않습니다.

다른 해결책이 있습니까?

+0

귀하의 필요에 맞지 않는 이유를 말씀해 주시겠습니까? 그 밖의 무엇을해야할까요? 서비스는 확실히 이런 식으로 제 선택 일 것입니다 ... –

답변

15

사용자가 성공적으로 로그인 할 때 심포니가 호출 할 AuthenticationHandler을 만들 수 있습니다.이 시나리오가 있다고 가정하면 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 

분명히 작동하려면 loginTime 속성과 해당 설정자를 사용하여 User 엔티티가 있어야합니다. 그리고 User 엔터티 저장소를 사용자 공급자로 사용하고 여기에 설명 된 DaoAuthenticationProvider (http://symfony.com/doc/current/book/security.html#loading-users-from-the-database)을 사용하도록 로그인을 구성해야합니다.

+0

'flush() '전에 Handler에서'persist()'호출을 놓쳤습니다 –

+1

Mmmm ...'persist()'가 필요하지 않다고 생각합니다. 왜냐하면'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

데이터베이스의 각 사용자 항목에 "last_login"필드가있는 경우 매우 간단한 해결책은 응용 프로그램에 FOSUserBundle을 구현하는 것입니다.