代码之家  ›  专栏  ›  技术社区  ›  Chuck Burgess

在CakePHP中,如果没有循环重定向,如何重定向到captcha for x失败?

  •  0
  • Chuck Burgess  · 技术社区  · 14 年前

    我正在使用核心身份验证组件。我创建了一个管理所有权限的用户登录名。我实现登录监控的方法是检查 $this->Auth->user() 在应用程序控制器中。每次应用程序控制器循环 beforeFilter() 功能和 !$this->Auth->user() ,它将增加 Captcha.LoginAttempts 会话变量。什么时候? Captcha.LoginAttempts

    我遇到的问题是,如果我在某个地方使用某个元素或引用页面上cake框架中的某个元素,它将命中重定向,并导致对实际控制器/操作外部调用的每个访问元素/组件进行无休止的循环重定向。有没有更好的方法来实现这一点?

    这是我一直在处理的实际代码。但基本上很糟糕(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

    1 回复  |  直到 14 年前
        1
  •  1
  •   Finster    14 年前

    通常情况下,我只会尝试回答您尝试的方式,但既然您要求提供更好的想法,我会做的是在登录页上实际使用验证码,并使用AuthComponents内置的方法和属性,如loginRedirect、autoRedirect和allow()。然后,只需根据Captchas.loginAttempts 变量。

    就你目前的方法而言,我认为你不会有一个优雅的方法来做这件事。但是,您可以更改AuthComponent的属性以获得所需的内容。您可以更改loginDirect和loginAction,使/captchas/index成为新的登录窗体,然后在验证成功后,将loginAction设置回/users/login或其他任何形式。这样,如果有人试图直接点击/users/login而不执行captcha,那么AuthComponent逻辑将启动并重定向到/captchas/index。

    以下是一些相关的手册页面:

    希望这有帮助!