Site、Ads、Message という名前の 3 つのコントローラーがあります。すべてのコントローラーにはキャプチャ アクション クラス定義があり、各コントローラーのアクセス ルールで許可されます。
キャプチャはサイト コントローラーではうまく機能しますが、他のコントローラーでは検証が機能しません。キャプチャ画像とレキャプチャも機能することを示していますが、検証だけでは機能しません。デバッグするアイデアはありますか?
アップデート :
Yii を調べてみたところ、何かが見つかりました。CCaptcha ウィジェットは、コントローラー名をセッション キーの一部として使用して、キャプチャ検証コードを保存します。
CCaptchaAction.php
protected function getSessionKey(){
return self::SESSION_VAR_PREFIX . Yii::app()->getId() . '.' . $this->getController()->getUniqueId() . '.' . $this->getId();
}
ご覧のとおり、 $this->getController()->getUniqueId()はsession key の一部です。
CCaptchaAction は、この関数を使用して検証コードを生成および検証します。
問題は、生成と検証が異なるコントローラーで行われることです。
明確な例では、 Controller AとBがあるとします。
コントローラAでキャプチャ生成が行われると、print_r($_SESSION) は次のようになります。
配列 ( [Yii.CCaptchaAction.12bd9136.A .captcha ] => eyntri [Yii.CCaptchaAction.12bd9136.A .captchacount ] => 1
コントローラBでキャプチャ検証が行われると、検証メソッドは以下をチェックします。
新規生成され、コントローラ B に表示されたコード=== $_SESSION[Yii.CCaptchaAction.12bd9136. .captcha ] が true かどうか。
そして、ジェネレーターとバリデーターのコントローラーが同じでない場合、それらは常に同じではありません!!