2013-01-21 76 views
2

我想在驗證用戶和密碼之前檢查處理程序中的驗證碼Google reCaptcha在檢查用戶驗證之前檢查reCaptcha - Symfony2

require_once('recaptchalib.php'); 
$privatekey = "your_private_key"; 
$resp = recaptcha_check_answer ($privatekey, 
          $_SERVER["REMOTE_ADDR"], 
          $_POST["recaptcha_challenge_field"], 
          $_POST["recaptcha_response_field"]); 
if (!$resp->is_valid) { 
    // What happens when the CAPTCHA was entered incorrectly 
    die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." . 
    "(reCAPTCHA said: " . $resp->error . ")"); 
} else { 
    // Your code here to handle a successful verification 
} 

我使用FOSUserBundle,我要檢查,如果驗證碼是一個處理器或延長一些控制器的驗證之前正確的。

我的問題是,我可以用什麼處理程序來做到這一點?像以前一樣登錄?

+1

只想讓你知道,有一個包這個。我使用'GregwarCaptchaBundle'available [here](https://github.com/Gregwar/CaptchaBundle),你可以在2分鐘內從字面上安裝。 – Mick

+0

謝謝@Patt!我安裝了,這是真的,它很容易安裝,但在這一刻我更喜歡谷歌reCaptcha。你知道是否像之前的LoginHandler或事件或監聽器一樣存在嗎? – Santi

回答

3

我看到這是一個老問題,但這裏是我做了什麼,以防它幫助某人。

你想創建一個自定義AuthenticationListener:

<?php 

namespace Acme\UserBundle\EventListener; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Security\Core\Exception\BadCredentialsException; 
use Symfony\Component\Security\Http\Firewall\UsernamePasswordFormAuthenticationListener; 

class FormAuthenticationListener extends UsernamePasswordFormAuthenticationListener 
{ 
    protected function attemptAuthentication(Request $request) 
    { 
     // check for a valid captcha here 
     // I am using the GregwarCaptchaBundle 
     // only shown when throttling in my case 
     $captcha = $request->request->get('login[captcha]', null, true); 
     if (null !== $captcha) { 
      $check = $request->getSession()->get('gcb_captcha'); 
      if ($captcha !== $check['phrase']) { 
       throw new BadCredentialsException('Captcha is invalid'); 
      } 
     } 

     return parent::attemptAuthentication($request); 
    } 
} 

您需要在您的包的配置或應用程序配置到註冊認證聽衆。

實例YAML:

parameters: 
    security.authentication.listener.form.class: Acme\UserBundle\EventListener\FormAuthenticationListener 

既然你覆蓋UsernamePasswordFormAuthenticationListener,不要忘記你的自定義邏輯之後,結束與return parent::attemptAuthentication($request)方法