Question

J'utilise le noyau composant Auth. J'ai créé un login utilisateur qui gère toutes les autorisations. La façon dont je suis le suivi de la mise en œuvre connexion est en vérifiant $this->Auth->user() dans le app_controller. Chaque fois que les cycles de app_controller la fonction beforeFilter() et !$this->Auth->user(), il incrémente la variable de session Captcha.LoginAttempts. Lorsque Captcha.LoginAttempts est> 3, je veux rediriger au contrôleur captchas, l'affichage d'un écran captcha demandant à l'utilisateur de confirmer qu'ils sont un être humain. (Similaire à la façon dont stackoverflow-t-il).

La question que j'ai est si je me sers d'un endroit de l'élément ou faisant référence quelque chose dans le cadre de gâteau sur la page, il a frappé le redirect et provoque une redirection circulaire sans fin pour chaque élément accès / être composant appelé externe au réel contrôleur / action. Y at-il une meilleure façon de mettre en œuvre ce?

Voici le code réel je suis de jouer avec. Mais il aspire essentiellement (OMI):

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

Vous pouvez voir comment j'essaie d'éviter la référence circulaire. Mais l'utilisateur peut simplement aller à la page de connexion et depuis la variable de session Captcha.fail est déjà défini, il ignorera la redirection. Il doit y avoir une façon plus élégante de mettre en œuvre. Tout le monde?

Était-ce utile?

La solution

Normalement, je voudrais simplement essayer de répondre à la façon dont vous essayez de le faire, mais puisque vous avez demandé une meilleure idée, ce que je ferais est que le Captcha fait sur la page de connexion et utiliser les AuthComponents builtin méthodes et propriétés comme loginRedirect, autoRedirect et permettre à (). Ensuite, il suffit de tourner le captcha on / off en fonction de la variable Captchas.loginAttempts.

Pour votre méthode actuelle, Je ne pense pas que vous allez obtenir une façon élégante de le faire. Cependant, vous pourriez être en mesure de modifier les propriétés de AuthComponent pour obtenir ce que vous voulez. Vous pouvez changer loginRedirect et loginAction de telle sorte que / captchas / index est le nouveau formulaire de connexion, puis captcha avec succès, de retour ensemble loginAction à / utilisateurs / login ou autre. De cette façon, si quelqu'un tente de frapper / utilisateurs / connexion directement sans faire le captcha, alors la logique de Auth et se lancer à redirect / captchas / index.

Voici quelques pages de manuel pertinentes:

Hope this helps!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top