2016-08-08 14 views
1

私はFosUserBundleEWZRecaptchaBundeを使用しています。 ログインフォームを上書きして、recaptchaフィールドを追加しました。すべてが機能しています。FOSUserログインフォーム内のReCaptchaを検証してください

問題は、ログインフォームの検証でreCaptchaフィールドが考慮されず、ユーザーが正しいログイン名とパスワードを入力した場合、ログに記録されることです。

私はキャプチャが有効であるかどうかが、私の 事前ログインが延び listenerであるかどうかをテストする必要があり 事前ログインイベントの並べ替えを行った

UsernamePasswordFormAuthenticationListenerと私は本当にどのように知りません。キャプチャ値を取得します。

これは私の事前ログイン彼らはusernamepassword値を取得するには、この$username = $request->get($this->options['username'], null, true);ようなものを使用UsernamePasswordFormAuthenticationListenerリスナー

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

    // ... 
} 

で、他のものを上書きattemptAuthentication方法です。これは、の値を_usernameまたは_passwordという名前(これはリスナーコンストラクタで定義されています)から取得します。

私は、キャプチャ値を見つけるために、他のフィールドと同じ方法で試みたが、キャプチャフィールドはiframe内側とdivなので、それが何かを見つけることができなかったので、私はnull毎回得ます。

このcaptchaから返された値を取得するにはどうすればいいですか(trueまたはfalse、私は新しいreCaptchaを使用しています)? 私はこの価値を見いだすためにどうすればよいのか、これがもちろん可能なのかどうかはわかりません。

ログインフォームでのキャプチャ検証を許可するのは良い方法ではないかもしれません。

私を助けてくれてありがとう。

答えて

0

実際にrecaptchaコードが有効であることを手動で確認したい場合は、独自の認証ハンドラを作成することができます。そのハンドラはAuthenticationSuccessHandlerInterfaceAuthenticationFailureHandlerInterfaceを実装する必要があります。

実装する必要がある2つの方法があります。 `

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

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

はあなたのクラスのコンストラクタを介してこれらのサービスを注入し、その後ContainerAwareでハンドラクラスを拡張する必要があるセッションとルーティングを使用するために。

サービスとしてカスタムハンドラを登録します。 `

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

をハンドラあなたはまた、GoogleのreCAPTCHAを使用して検討することもでき、あなたのsecurity.yml file

に次の行を追加します有効にするには。

+0

バンドルは、captchaがOKかどうかをチェックするバリデータを与えます。このバリデータは、Captchaフィールドに 'IsTrue'制約を置くと他のフォームで使用されます。しかし、このバリデータはログインフォームでは使用されません。あなたのメソッドは、このカスタムバリデータで使用できますか? –

+0

あなたはあなたと一緒に作業する必要があるものを注入することができます – nix9

関連する問題