2010-08-17 35 views
0

我正在使用核心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已經設置,它將忽略重定向。必須有一個更優雅的方式來實現這一點。任何人?

+1

它爲什麼在app_controller中?你只是想控制登錄?正如我將它放在用戶控制器中。我也會使用'$ this-> Session-> check()'來檢查會話。它也似乎你永遠不會初始化'Captcha.LoginAttempts'爲0.默認可能會得到它,但這可能是爲什麼。 – 2010-08-17 13:16:55

+0

我想在app_controller中使用它,以便它可以從Users控制器中分離出來。 (可移植性)。我希望能夠在全球範圍內實現這一點(就像核心Auth組件一樣)。但是我撞牆了,我的大腦陷入了困境。此外,我打算使用它來快速禁止入口,以免人員以編程方式訪問表單。我應該採取另一種方法嗎? – 2010-08-17 14:16:22

+1

「...刪除某人訪問窗體programaticaly」 - 使用安全組件。 – bancer 2010-08-17 16:29:42

回答

1

通常情況下,我會試着回答你嘗試這樣做的方式,但是既然你問了任何更好的想法,我要做的就是在登錄頁面上實際使用Captcha,並使用AuthComponents內置方法和諸如loginRedirect,autoRedirect和allow()等屬性。然後,只需根據Captchas.loginAttempts變量開啓/關閉驗證碼即可。

對於你目前的方法,我不認爲你會得到一個這樣做的優雅方式。但是,您可能可以更改AuthComponent的屬性以獲取所需內容。您可以更改loginRedirect和loginAction,以便/ captchas/index是新的登錄表單,然後在成功的驗證碼上,將loginAction設置回/ users/login或其他。這樣,如果有人試圖直接打/用戶/直接登錄而不進行驗證碼,那麼AuthComponent邏輯就會啓動並重定向到/ captchas/index。

這裏有一些相關的手冊頁:

希望這有助於!

+0

我喜歡auth重定向的想法。這可以做到這一點。我將執行並報告這是如何工作的。感謝您的好建議! – 2010-08-17 15:58:51

+0

不幸的是,$ this-> Auth-> loginAction ='';不會做我想要的 - 它只會以默認方式重新引導未經認證的用戶。所以我不能改變這個中間流(例如)以及三次失敗的嘗試現在如何路由到驗證碼/索引。但是,感謝這個想法。這值得期待。 – 2010-08-17 19:06:52

相關問題