我正在使用核心Auth組件。我創建了一個管理所有權限的用戶登錄名。我正在實施登錄監控的方式是檢查app_controller中的$this->Auth->user()
。每當app_controller循環使用beforeFilter()
函數和!$this->Auth->user()
時,它將增加Captcha.LoginAttempts
會話變量。當Captcha.LoginAttempts
> 3時,我希望它重定向到Captchas控制器,顯示驗證碼屏幕,要求用戶確認它們是人類。 (類似於stackoverflow的做法)。如何在沒有在CakePHP中循環重定向的情況下嘗試重定向到驗證碼x失敗?
我遇到的問題是,如果我使用某個元素或者在頁面上的蛋糕框架中引用了某些內容,它將觸及重定向並導致對每個訪問的元素/組件的外部循環重定向實際控制人/行動。有沒有更好的方法來實現這一點?
這是我一直在搞的實際代碼。但它基本上吸(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
已經設置,它將忽略重定向。必須有一個更優雅的方式來實現這一點。任何人?
它爲什麼在app_controller中?你只是想控制登錄?正如我將它放在用戶控制器中。我也會使用'$ this-> Session-> check()'來檢查會話。它也似乎你永遠不會初始化'Captcha.LoginAttempts'爲0.默認可能會得到它,但這可能是爲什麼。 – 2010-08-17 13:16:55
我想在app_controller中使用它,以便它可以從Users控制器中分離出來。 (可移植性)。我希望能夠在全球範圍內實現這一點(就像核心Auth組件一樣)。但是我撞牆了,我的大腦陷入了困境。此外,我打算使用它來快速禁止入口,以免人員以編程方式訪問表單。我應該採取另一種方法嗎? – 2010-08-17 14:16:22
「...刪除某人訪問窗體programaticaly」 - 使用安全組件。 – bancer 2010-08-17 16:29:42