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);
    }
}

バンドル構成またはアプリ構成に認証リスナーを登録する必要があります。

YAML での例:

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

return parent::attemptAuthentication($request)UsernamePasswordFormAuthenticationListener をオーバーライドするため、カスタム ロジックの後にメソッドを終了することを忘れないでください。

于 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 に答える