如何在CakePHP中没有循环重定向的情况下尝试重定向到验证码的x失败?

时间:2010-08-17 02:59:31

标签: php cakephp php-5.3 cakephp-1.3

我正在使用核心Auth组件。我创建了一个管理所有权限的用户登录。我实现登录监控的方法是检查app_controller中的$this->Auth->user()。每次app_controller循环beforeFilter()函数和!$this->Auth->user()时,它都会递增Captcha.LoginAttempts会话变量。当Captcha.LoginAttempts是> 3,我希望它重定向到Captchas控制器,显示验证码屏幕,要求用户确认它们是人。 (类似于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会话变量已经设置,它将忽略重定向。必须有一种更优雅的方式来实现它。任何人吗?

1 个答案:

答案 0 :(得分:1)

通常情况下,我会尝试回答您尝试这样做的方式,但是由于您要求更好的想法,我要做的是在登录页面上实际使用Captcha并使用AuthComponents内置方法和属性比如loginRedirect,autoRedirect和allow()。然后,根据Captchas.loginAttempts变量打开/关闭验证码。

对于您当前的方法,我认为您不会以优雅的方式执行此操作。但是,您可以更改AuthComponent的属性以获得所需的内容。您可以更改loginRedirect和loginAction,以便/ captchas / index是新的登录表单,然后在成功的验证码上,将loginAction设置回/ users / login或其他。这样,如果有人试图直接命中/ users / login而不进行验证码,那么AuthComponent逻辑将启动并重定向到/ captchas / index。

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

希望这有帮助!