在检查用户验证之前检查reCaptcha - Symfony2

时间:2013-01-21 18:20:42

标签: php symfony fosuserbundle

我想在验证用户和密码之前检查处理程序中的Captcha Google reCaptcha

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,我想在使用处理程序验证或扩展某些控制器之前检查验证码是否正确。

我的问题是,我可以使用什么处理程序来执行此操作?像之前的事情登录?

2 个答案:

答案 0 :(得分: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);
    }
}

您需要在Bundle配置或app config中注册您的身份验证监听器。

YAML中的示例:

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

由于您覆盖了UsernamePasswordFormAuthenticationListener,因此请不要忘记在自定义逻辑后使用return parent::attemptAuthentication($request)结束方法

答案 1 :(得分:1)

您可以覆盖FOSUserBundle登录控制器并在loginAction

中插入验证码逻辑

在这里您可以找到如何覆盖控制器: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/overriding_controllers.md