2016-08-08 10 views
1

Ich verwende FosUserBundle und EWZRecaptchaBunde. Ich übersteuerte das Login-Formular, um das Recaptcha-Feld hinzuzufügen. Alles funktioniert.Bestätigen ReCaptcha in FOSUser Login-Formular

Das Problem ist, dass die Validierung des Anmeldeformulars das Feld reCaptcha nicht berücksichtigt und der Benutzer ein korrektes Login und Passwort eingibt, wird er protokolliert.

ich eine Art pre Login Ereignis gemacht haben, die prüfen sollten, ob das Captcha gültig ist oder nicht, aber meine pre Login ist ein listener die UsernamePasswordFormAuthenticationListener und ich weiß wirklich reicht nicht, wie man Erhalte den Captcha-Wert.

Dies ist die attemptAuthentication Methode, die andere außer Kraft setzen, in meinem pre Login Zuhörer

protected function attemptAuthentication(Request $request) 
{ 
    // ... 

    // I only have added this (return null everytime) 
    $captcha = $request->get($this->options['recaptcha'], null, true); 

    if ($captcha && true !== $captcha) { 
     throw new BadCredentialsException('Invalid captcha.'); 
    } 

    // ... 
} 

Im UsernamePasswordFormAuthenticationListener sie so etwas wie diese $username = $request->get($this->options['username'], null, true); verwendet username und password Wert zu erhalten. Dies erhält die Werte von input, die _username oder _password Namen haben (diese sind im Listener-Konstruktor definiert).

ich mit dem gleichen Verfahren wie das andere Feld versucht, den Captcha-Wert, aber das Captcha-Feld zu finden, ist ein div mit einem iframe nach innen, so dass ich null jedes Mal, weil es nicht alles finden.

Wie kann ich den Wert erhalten, der von diesem Captcha zurückgegeben wird (richtig oder falsch, verwende ich das neue reCaptcha)? Ich weiß wirklich nicht wie ich tun soll um diesen Wert zu finden und wenn das natürlich möglich ist.

Es ist vielleicht nicht die gute Methode zu tun, um Captcha-Validierung in Login-Form zu ermöglichen.

Vielen Dank für Ihre Hilfe.

Antwort

0

Wenn Sie tatsächlich überprüfen möchten, ob der angegebene Recaptcha-Code gültig ist, können Sie Ihren eigenen Authentifizierungshandler erstellen. Dieser Handler muss AuthenticationSuccessHandlerInterface und AuthenticationFailureHandlerInterface implementieren.

Es gibt zwei Methoden, die umgesetzt werden muss: `

public function onAuthenticationSuccess(Request $request, TokenInterface $token) { 
    // validate captcha code 
} 

public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { 
    // validate captcha code 
}` 

Um zu verwenden Session und Routing Sie Handler-Klasse mit ContainerAware dann injizieren diese Dienste über Konstruktor Ihrer Klasse erweitern müssen.

Ihre benutzerdefinierten Handler als Dienst registrieren: `

... 
    #app/config/security.yml 
     security.authentication_handler: 
      class: AppBundle\Handler\AuthenticationHandler 
     public: false 
     arguments: 
      - @router 
      - @session 
     calls: 
      - [ setContainer, [@service_container ] ] 

Damit Handler folgende Zeilen zu Ihrer security.yml file

Sie auch hinzufügen könnte mit Google reCAPTCHA betrachten.

+0

Das Bündel gibt einen Validator, der überprüft, ob das Captcha in Ordnung ist oder nicht. Dieser Validator wird in anderen Formularen verwendet, wenn ich die Bedingung 'IsTrue' für das Captcha-Feld festlege. Dieser Validator wird jedoch nicht im Anmeldeformular verwendet. Kann Ihre Methode mit diesem benutzerdefinierten Validator verwendet werden? –

+0

Sie können dort alles injizieren, was Sie brauchen, um damit zu arbeiten – nix9