2012-06-19 28 views
8

Tôi muốn tạo trình kiểm tra người dùng tùy chỉnh để xác thực hành động đăng nhập đối với eula được chấp nhận cuối cùng. ' Ý tưởng khá đơn giản, sẽ có nhiều phiên bản eula và người dùng không thể đăng nhập cho đến khi anh ấy chấp nhận eula mới nhất.Trình kiểm tra người dùng tùy chỉnh của Symfony2 dựa trên eula được chấp nhận

Kịch bản là:

  1. Người dùng tạo tài khoản mới và chấp nhận EULA.
  2. Eula được cập nhật
  3. dùng cố gắng đăng nhập, nhưng ông đã không chấp nhận EULA mới nhất
  4. tài được biểu mẫu đăng nhập tương tự nhưng với trường bổ sung "chấp nhận EULA mới nhất"
  5. người dùng đăng nhập và hệ thống chèn thông tin: hiện tại ngày và giờ, Id người dùng, Eula id để theo dõi việc chấp nhận eula.

Tôi thấy điều này: https://groups.google.com/forum/#!msg/symfony2/D0V0bFks9S0/Qg9mrbpfB3IJ

Nhưng tiếc là không có phiên bản đầy đủ của người dùng tùy chỉnh trình kiểm tra. Làm thế nào để tôi thực hiện phần còn lại của nó?

+0

Tôi biết câu hỏi này là ngày ... Nhưng tôi đang phải đối mặt với một tình huống mà tôi cảm thấy cần phải ghi đè lên kiểm tra người dùng. Bạn đã tìm thấy giải pháp chưa? – Fatmuemoo

Trả lời

0

Tại sao không đính kèm trình xử lý sự kiện vào sự kiện kernel.request và xem liệu người dùng đã đăng nhập hiện tại có chấp nhận EULA mới nhất không?

Để có được sử dụng hiện tại bạn có thể sử dụng một cái gì đó như thế này:

$securityContext = $this->container->get('security.context'); 
if (!$securityContext) { 
    return; 
} 

$user = $securityContext->getToken()->getUser(); 
+0

Trình xử lý sự kiện sẽ giống như kiểm tra mọi hành động của người dùng. Có lẽ linh hoạt hơn nhưng bạn vẫn sẽ được chứng thực trong trường hợp này. Tôi cần kiểm tra ** này trước khi ** người dùng sẽ được xác thực. – Kaminari

+0

Trong trường hợp này, bạn nên sử dụng dấu được lưu trữ trong phiên. Bạn có thể nhận phiên từ yêu cầu, có sẵn trong sự kiện này. –

8

Câu trả lời thực sự là khá rõ ràng. Trong gói tùy chỉnh của bạn:

config.yml

parameters: 
    security.user_checker.class: Acme\Bundle\UserBundle\Security\UserChecker 

Userchecker:

class UserChecker extends BaseUserChecker 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function checkPreAuth(UserInterface $user) 
    { 
     //do your custom preauth stuff here 
     parent::checkPreAuth($user); 
    } 
} 
6

Bạn có thể xác định lại dịch vụ người sử dụng kiểm tra Symfony của (security.user_checker) trong nhóm của mình:

# services.yml 
security.user_checker: 
    class: MyBundle\Checker\UserChecker 
    arguments: [ "@some.service", "%some.param%" ] 

Sau đó mở rộng UserChecker của Symfony:

# UserChecker.php 

use Symfony\Component\Security\Core\User\UserChecker as BaseUserChecker; 

class UserChecker extends BaseUserChecker 
{ 
    public function checkPreAuth(UserInterface $user) 
    { 
     parent::checkPreAuth($user); 

     // your stuff 
    } 

    public function checkPostAuth(UserInterface $user) 
    { 
     parent::checkPostAuth($user); 

     // your stuff 
    } 
} 

Dịch vụ security.user_checker được gọi trong \Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider::authenticate() trong quá trình xác thực

+0

trong services.yml của bạn, vui lòng thay đổi thành: 'services: security.user_checker:' –

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