2012-07-27 112 views
0

在我的應用程序中,我需要在應用程序工作開始時進行某種「自動登錄」邏輯。在這個「自動登錄」功能中,我執行了許多操作,其中之一 - 使用CookieComponent設置cookie。如何在CakePHP調度程序過濾器中設置cookie?

當我在控制器或組件中使用此自動登錄時 - 一切正常,但是當我通過調度程序過濾器執行相同操作時,Cookie不會設置。

我深入研究了CakePHP代碼,發現當我嘗試從調度程序過濾器設置cookie時,$_cookies屬性CakeResponse爲空。所以它看起來像調度過濾器創建自己的CakeResponse,它稍後重置,所以不設置cookie。

我的過濾器看起來是這樣的:

class UserLoadFilter extends DispatcherFilter 
{ 
    public $priority = 8;  
    public function beforeDispatch($event) { 
     App::uses('AuthComponent', 'Controller/Component'); 
     if (!AuthComponent::user()) { 
      App::uses('CustomAuthComponent', 'Controller/Component'); 
      //$controller = new AppController($event->data['request'], $event->data['response']); 
      $auth = new CustomAuthComponent(new ComponentCollection(), Configure::read('Auth')); 
      $auth->autoLogin(); 
     } 
    } 
} 

我也試過直接在beforeDispatch方法以這種方式設置的cookie:

App::uses('CookieComponent', 'Controller/Component'); 
$cookie = new CookieComponent(new ComponentCollection()); 
$cookie->write('test', 'TEST!', false, "1 day"); 

但這沒有任何意義了。

我該怎麼做?也許我只是看不到一些簡單的東西,但我花了很多時間,仍然無法解決這個問題。從這個地方設置cookie是否可能?

當然,我可以嘗試使用setcookie,或寫自己的cookie包裝,但我想用CakePHP風格,使用cookie組件。

回答

1

這看起來不對我。 2.x使用認證和授權對象,因此不需要CustomAuthComponent(意味着組件部分)。相反,您可以創建自定義的authentication and authorization objects

我看不出爲什麼必須在beforeDispatcher()中完成這個工作。那麼你的目標是什麼?你想要實現什麼樣的認證?

編輯根據您的評論:

你標識的用戶後爲鮑里斯說,你的區域被設置簡單的重定向(如果你這樣做是正確的)。因此,只需從beforeFilter()中的cookie中讀取uuid,基於該記錄獲取用戶記錄並使用用戶記錄進行「手動」登錄然後重定向。

你在AuthComponent中修改了什麼?

+0

我嘗試恢復用戶數據並使用其cookie中的用戶UUID值自動登錄他(但如果用戶沒有帶UUID值的cookie,則創建新的用戶實體並將用戶UUID設置爲此用戶的cookie) 。因此,假設,如果用戶將在monthes之後回到網站,他將會登錄並重定向到他的語言環境。我想在beforeDispatcher()中執行它,因爲我想在路由啓動之前知道用戶區域設置。 關於自定義認證對象 - 我使用它,但我也需要對Auth組件進行一些更改,所以我將它擴展到我的CustomAuthComponent中。 – Vovkin 2012-07-30 07:57:21

+1

@Vovkin在用戶被識別並登錄之後,您可以重定向到正確的語言環境。這可以避免在'beforeDispatch()'中執行此操作。 – 2012-07-30 09:18:14

相關問題