2012-06-19 17 views
8

Chcę utworzyć niestandardowy sprawdzacz użytkownika, aby sprawdzić działanie logowania przed ostatnio zaakceptowanym eula. " " Pomysł jest dość prosty, będzie wiele wersji eula i użytkownik nie może się zalogować, dopóki nie zaakceptuje ostatniego eula.Niestandardowy kontroler użytkownika Symfony2 na podstawie zaakceptowanego eula

Scenariusz jest:

  1. użytkownik tworzy nowe konto i akceptuje EULA.
  2. Eula aktualizowany
  3. użytkownik próbuje się zalogować, ale on zrobił przyjąć najnowszą EULA
  4. Użytkownik dostaje ten sam formularz logowania, ale z dodatkowym polu „przyjąć najnowszy EULA”
  5. użytkownik loguje się i System wstawia informacje: Current data i godzina, identyfikator użytkownika, identyfikator Eula, aby śledzić akceptację eula.

Znalazłem to: https://groups.google.com/forum/#!msg/symfony2/D0V0bFks9S0/Qg9mrbpfB3IJ

Ale niestety nie ma pełnej wersji sprawdzający użytkownika niestandardowego. Jak zaimplementować resztę?

+0

wiem, to pytanie jest przestarzały ... Ale mam do czynienia z sytuacją, w której czuję potrzebę, aby zastąpić sprawdzania użytkownika. Znalazłeś rozwiązanie? – Fatmuemoo

Odpowiedz

0

Dlaczego nie dołączyć detektora zdarzeń do zdarzenia kernel.request i oglądać, czy bieżący zarejestrowany użytkownik zaakceptował najnowszą umowę EULA?

Aby uzyskać bieżący użytkownik może użyć coś takiego:

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

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

Detektor zdarzeń będzie taki sam, jak sprawdzanie każdej akcji użytkownika. Może bardziej elastyczne, ale nadal będziesz uwierzytelniony w tym przypadku. Muszę to sprawdzić ** zanim ** użytkownik zostanie uwierzytelniony. – Kaminari

+0

W takim przypadku należy użyć oznaczonej pozycji zapisanej w sesji. Możesz uzyskać sesję z żądania, które jest dostępne w tym wydarzeniu. –

8

Odpowiedź jest dość oczywista. W niestandardowego pakietu:

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

Można zmienić usługę sprawdzania użytkownik Symfony'S (security.user_checker) w zestawie:

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

Następnie rozszerz Symfony's UserChecker:

# 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 
    } 
} 

Usługa security.user_checker jest wywoływana w \Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider::authenticate() podczas procesu uwierzytelniania

+0

w swoim services.yml, zmień na: 'services: security.user_checker:' –