2012-03-20 64 views
11

我正在使用CakePHP 2.0的集成Auth組件。 我有以下表格:

  • 用戶
  • 簡介

我的模型關係如下:

User belongsTo Group 
User hasMany Profiles 

登錄至該網站,我注意到Auth會話只包含用戶表信息,但我也需要登錄用戶的組和配置文件表的信息。

有什麼辦法可以用Auth組件做到這一點嗎?

回答

6

由於處理會話密鑰的方式,無法使用AuthComponent來執行此操作。但是,您可以將它自己保存到會話中。

做到這一點的唯一方法是添加到會話時,在用戶登錄:在您的AppController

function login() { 
    if ($this->Auth->login($this->data)) { 
     $this->User->id = $this->Auth->user('id'); 
     $this->User->contain(array('Profile', 'Group')); 
     $this->Session->write('User', $this->User->read()); 
    } 
} 

然後在你的beforeFilter(),節約無功的控制器去:

function beforeFilter() { 
    $this->activeUser = $this->Session->read('User'); 
} 

// and allow the views to have access to user data 
function beforeRender() { 
    $this->set('activeUser', $this->activeUser); 
} 

更新:從CakePHP 2開始。2(announced here),AuthComponent現在接受'包含'鍵來存儲會話中的額外信息。

+0

在會話中設置用戶時出現警告字。即使在用戶不再被認證之後,會話數據仍然可以保持設置。您需要確保在註銷時刪除Session數據。您只需將會話保存爲「Auth.User」而不是「User」即可完成此操作。 +1用於更新您提供CakePHP 2.2更新的答案。 – drmonkeyninja 2012-12-19 09:31:18

1

據我所知,Auth組件只緩存用戶模型中的數據。您可以使用該信息來從其他型號檢索所需的數據,例如通過在你的控制器使用此:

$group_data = $this->Group->findById($this->Auth->user('group_id')); 

或者

$profile_data = $this->Profile->findByUserId($this->Auth->user('id')); 

但我不認爲你可以得到它直接使用Auth組件,因爲它不會將相關模型數據從框中緩存。

+0

我需要通過網站的所有信息,所以只能從AUTH嘗試。所以不希望寫一個查詢查詢.. :) – AnNaMaLaI 2012-03-20 13:40:31

1

兩種方式:

1)擴大FormAuthenticate類(見/控制器/分量/驗證)或任何用於登錄並覆蓋_findUser()方法,並告訴驗證組件使用這個授權類。看到這個頁面如何做到這一切http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

2)簡單地在模型中實現一個方法,將獲取所需的所有數據,並在控制器的登錄方法中調用它並將數據寫入會話。國際海事組織擁有這樣的方法很方便,因爲有時你需要刷新會話數據。

因爲對方的回答您的評論的:

你必須寫一個方法和一個模型,將返回數據的一些代碼。沒有代碼,CakePHP無法讀取您的想法和數據庫。無論您使用哪種建議方式,您都必須編寫代碼。