كيفية إعادة توجيه إلى Captcha لـ X فشل محاولة دون إعادة توجيه دائري في CakePhP؟

StackOverflow https://stackoverflow.com/questions/3499011

سؤال

أنا أستخدم مكون المصادقة الأساسية. لقد أنشأت تسجيل دخول مستخدم يدير جميع الأذونات. الطريقة التي أقوم بتنفيذ مراقبة تسجيل الدخول هي عن طريق التحقق من $this->Auth->user() في app_controller. في كل مرة يدور App_Controller beforeFilter() وظيفة و !$this->Auth->user(), ، سوف يزيد Captcha.LoginAttempts متغير الجلسة. متي Captcha.LoginAttempts IS> 3 ، أريد إعادة توجيه إلى وحدة تحكم Captchas ، مع عرض شاشة Captcha التي تتطلب من المستخدم تأكيد أنها إنسان. (على غرار كيفية قيام Stackoverflow بذلك).

المشكلة التي أواجهها هي أنه إذا كنت أستخدم عنصرًا في مكان ما أو أشير إلى شيء ما داخل إطار الكيك على الصفحة ، فستصل إلى إعادة التوجيه ويتسبب . هل هناك طريقة أفضل لتنفيذ هذا؟

هنا هو الرمز الفعلي الذي كنت أتعامل معه. لكنها تمتص أساسًا (IMO):

// this is in the app_controller beforeFilter() method.

if($this->Auth->user()) {
            $this->Session->delete('Captcha');
        } else {
            $this->Session->write('Captcha.LoginAttempts', $this->Session->read('Captcha.LoginAttempts') + 1);
            if ($this->Session->read('Captcha.LoginAttempts') > 3) {
                if (!$this->Session->read('Captcha.controller')) {
                    $this->Session->write('Captcha.controller', $this->params['controller']);
                    $this->Session->write('Captcha.action', $this->params['action']);
                }
                if ($this->Session->read('Captcha.fail') !== 'true') { // avoid circular reference redirects
                    $this->Session->write('Captcha.fail', 'true');
                    $this->redirect(array('controller' => 'captchas', 'action' => 'index'));
                }
            }
        }

يمكنك أن ترى كيف أحاول تجنب المرجع الدائري. ولكن بعد ذلك يمكن للمستخدم الانتقال إلى صفحة تسجيل الدخول ومنذ ذلك الحين Captcha.fail تم تعيين متغير الجلسة بالفعل ، وسوف يتجاهل إعادة التوجيه. يجب أن يكون هناك طريقة أكثر أناقة لتنفيذ هذا. أي واحد؟

هل كانت مفيدة؟

المحلول

عادة ، سأحاول فقط الإجابة على الطريقة التي تحاول القيام بها ، ولكن بما أنك طلبت أي أفكار أفضل ، فإن ما سأفعله هو أن يكون Captcha فعليًا على صفحة تسجيل الدخول واستخدام أساليب وخصائص AuthComponents مثل Loginredirect ، أوتيرريك ، والسماح (). ثم ، ما عليك سوى تشغيل Captcha/OFF بناءً على متغير captchas.loginattempts.

لطريقتك الحالية ، لا أعتقد أنك ستحصل على طريقة أنيقة للقيام بذلك. ومع ذلك ، قد تكون قادرًا على تغيير خصائص المكون AuthComponent للحصول على ما تريد. يمكنك تغيير loginredirect وتسجيل الدخول بحيث /captchas /index هو نموذج تسجيل الدخول الجديد ، ثم على captcha الناجح ، تعيين تسجيل الدخول مرة أخرى إلى /المستخدمين /تسجيل الدخول أو أي شيء آخر. وبهذه الطريقة ، إذا كان شخص ما سيحاول ضرب /تسجيل الدخول /تسجيل الدخول مباشرة دون القيام بـ Captcha ، فإن منطق AuthComponent سيقوم بالركض ويعيد توجيهه إلى /captchas /index.

فيما يلي بعض الصفحات اليدوية ذات الصلة:

أتمنى أن يساعدك هذا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top