2

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

我的问题是,我可以使用什么处理程序来执行此操作?和以前一样登录?

4

2 回答 2

4

我看到这是一个老问题,但这是我所做的,以防它帮助某人。

你想创建一个自定义的 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 配置或应用程序配置中注册您的身份验证侦听器。

YAML 中的示例:

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

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

于 2013-11-09T04:57:43.657 回答
1

您可以覆盖 FOSUserBundle 登录控制器并在其中插入验证码逻辑loginAction

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

于 2013-01-22T10:14:47.500 回答