2012-06-06 33 views
5

Có cách nào tôi có thể lưu trữ khi nào là lần cuối cùng người dùng đăng nhập không?Symfony2 Đăng nhập và Bảo mật

Tôi đang sử dụng symfony2 và mọi thứ hoạt động ổn định với cấu hình bảo mật.

Tôi đã nhìn thấy điều này Security and login on a Symfony 2 based project, là một câu hỏi tương tự, nhưng nó không phù hợp với nhu cầu của tôi.

Có giải pháp nào khác không?

+0

Bạn có thể cho chúng tôi biết tại sao nó không phù hợp với nhu cầu của bạn không? Bạn cần làm gì khác? Dịch vụ chắc chắn sẽ là lựa chọn của tôi cho một cái gì đó như thế này ... –

Trả lời

15

Bạn có thể tạo AuthenticationHandler mà Symfony sẽ gọi khi người dùng đăng nhập thành công, bạn có thể lưu thời gian đăng nhập vào thuộc tính thực thể User (giả sử bạn có kịch bản này).

Đầu tiên, tạo xử lý xác thực thành công:

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

Sau đó, bạn cần phải đăng ký xử lý xác thực như một dịch vụ trong một tập tin cấu hình, ví dụ, src/Acme/TestBundle/resources/Config/services.yml

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

Và cấu hình đăng nhập để sử dụng trình xử lý được tạo, hãy xem security.yml

form_login: 
    success_handler: authentication_handler 
của bạn

Rõ ràng, để làm việc này, bạn cần có một thực thể User với thuộc tính loginTime và bộ đặt tương ứng. Và bạn cần định cấu hình đăng nhập để sử dụng kho lưu trữ đối tượng User làm nhà cung cấp dịch vụ người dùng và DaoAuthenticationProvider, như được giải thích tại đây: http://symfony.com/doc/current/book/security.html#loading-users-from-the-database.

+0

Bạn đã bỏ lỡ lệnh 'persist()' trong trình xử lý trước khi 'flush()' –

+1

Mmmm ... Tôi không nghĩ rằng 'persist()' là cần thiết vì đối tượng 'User' được định vị qua kho' User' đã được quản lý bởi Doctrine entity manager. Kiểm tra http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork.html#how-doctrine-keeps-track-of-objects này. – eagleoneraptor

+0

Trong ví dụ của bạn, bạn chuyển hướng người dùng đến đường dẫn 'login_success'. Tôi đang sử dụng 'target_path_parameter' trong biểu mẫu đăng nhập của mình. Làm thế nào tôi có thể chuyển hướng người dùng đến trang mà anh sắp sửa đi (Tôi không biết đó là trang quản trị, trang sản phẩm, v.v.)? –

5

Một giải pháp khá đơn giản là triển khai FOSUserBundle trong ứng dụng của bạn vì mỗi mục nhập người dùng trong cơ sở dữ liệu có (trong số những thứ khác) là trường "last_login".

Các vấn đề liên quan