Frage

Ich bin mit dem Kern Auth Komponente. Ich habe eine Benutzeranmeldung erstellt, die alle Berechtigungen verwaltet. Die Art, wie ich die Login-Überwachung bin die Umsetzung ist von dem app_controller für $this->Auth->user() überprüfen. Jedes Mal, wenn die app_controller Zyklen der beforeFilter() Funktion und !$this->Auth->user(), wird es das Captcha.LoginAttempts Session-Variable erhöhen. Wenn Captcha.LoginAttempts> 3, möchte ich es an die Captchas Controller umleiten, ein Captcha Bildschirm dass der Benutzer die Anzeige ein Mensch bestätigen sie sind. (Ähnlich wie Stackoverflow tut es).

Das Problem, das ich habe, ist, wenn ich im Kuchen Rahmen eines Element irgendwo oder Referenzierung etwas bin mit auf der Seite, wird die Umleitung getroffen und eine endlose Kreis Umleitung verursacht für jeden Zugriff auf Elemente / Komponenten Wesen namens außerhalb der eigentlichen Controller / action. Gibt es einen besseren Weg, um dies?

zu implementieren

Hier ist der eigentliche Code, den ich mit Messing wurde. Aber es saugt im Grunde (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'));
                }
            }
        }

Sie können sehen, wie ich versuche, die zirkuläre Referenz zu vermeiden. Aber dann könnte der Benutzer gehen Sie einfach auf die Login-Seite und da das Captcha.fail Session-Variable bereits gesetzt ist, wird die Umleitung ignorieren. Es muss ein elegantere Weg, dies zu realisieren. Anyone?

War es hilfreich?

Lösung

Normalerweise würde ich nur versuchen, die Art und Weise zu beantworten, die Sie versuchen, es zu tun, aber da sie eine bessere Idee gefragt, was würde ich tun, ist den Captcha tatsächlich auf der Login-Seite und verwenden Sie die AuthComponents builtin Methoden und Eigenschaften wie loginRedirect, autoRedirect und lassen (). Dann schalten Sie einfach das Captcha ein / aus auf der Grundlage der Captchas.loginAttempts Variable.

Für Ihre aktuelle Methode, ich glaube nicht, dass Sie eine elegante Art und Weise, dies zu tun bekommen werden. Allerdings könnten Sie in der Lage, die Eigenschaften des Auth Komponente zu ändern, zu bekommen, was Sie wollen. Sie könnten loginRedirect und loginaction, so dass / Captchas / Index ändern ist das neue Login-Formular, dann auf erfolgreiche captcha, Set loginaction zurück zu / Benutzer / login oder was auch immer. Auf diese Weise, wenn jemand zu Treffer- / Benutzer / login zu versuchen, war direkt ohne das Captcha zu tun, dann ist die Auth Komponente Logik in und Umleitung / Captchas / index treten würde.

Hier sind einige relevante Handbuch Seiten:

Hope, das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top