2013-03-20 42 views
0

我有一個基於食譜教程的用戶設置與用戶&組的Auth的工作示例。我有一個額外的位置表,它與我的組相關聯。 位置hasMany Group。組歸屬地點。在2.2中,我認爲我應該能夠獲取用戶的位置數據,但無法。cakephp 2.2使用包含與Auth不工作

// App controller 
public function beforeFilter() { 

    $this->Auth->authenticate = array(
     'all' => array (
      'scope' => array('User.status' => 1) 
     ), 
     'Form' => array(
       'contain' => array('Group', 'Location'), 
       'fields' => array('Location.name') 
     ) 
); 

上述代碼僅適用於創建用戶和位置之間的直接關聯。是否可以在此處使用包含組到位置關聯的組合?

回答

1

BaseAuthenticate的問題是如何返回用戶信息:return $result[$model];
所以,當我需要包含我使用放置在app /控制器/驗證替代組件:

App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class FormAndContainableAuthenticate extends FormAuthenticate { 

    protected function _findUser($username, $password) { 
     if (empty($this->settings['contain'])) { //< deafult 
      $userData = parent::_findUser($username, $password); 
     } else { //< with contains 
      $userModel = $this->settings['userModel']; 
      list($plugin, $model) = pluginSplit($userModel); 
      $fields = $this->settings['fields']; 
      $conditions = array(
       $model . '.' . $fields['username'] => $username, 
       $model . '.' . $fields['password'] => $this->_password($password), 
      ); 
      if (!empty($this->settings['scope'])) { 
       $conditions = array_merge($conditions, $this->settings['scope']); 
      } 
      $modelObj = ClassRegistry::init($userModel); 
      $modelObj->contain($this->settings['contain']); 
      $result = $modelObj->find('first', array(
       'conditions' => $conditions 
      )); 
      if (empty($result) || empty($result[$model])) { 
       return false; 
      } 
      foreach($result as $modelName => $modelData) { 
       if ($modelName !== $model) { 
        $result[$model][$modelName] = $modelData; 
       } 
      } 
      $userData = $result[$model]; 
     } 
     // remove dangerous fields like password 
     unset($userData[$this->settings['fields']['password']]); 
     if (!empty($this->settings['exclude'])) { 
      foreach ($this->settings['exclude'] as $fieldName) { 
       unset($userData[$fieldName]); 
      } 
     } 
     return $userData; 
    } 
} 

正如你所看到的 - 它使用父Component不包含提供時。

還有一些好處:您可以提供一組字段以從結果數組中刪除。只是通過通過字段名「排除」鍵

如何使用組件:

public $components = array(
     'Auth' => array(
      'authenticate' => array(
       'FormAndContainable' => array(
        'fields' => array(
         'username' => 'username', 
         'password' => 'password', 
        ), 
        'userModel' => 'Staff', 
        'contain' => array('StaffPermission'), 
        'exclude' => array('plain_password') 
       ) 
      ), 
     ), 
    ); 
+0

Swayok - 謝謝!這解決了我的問題。 – drpudding 2013-03-21 17:59:58

1

如果用戶沒有連接到位置,但集團是,你應該試試這個:

'contain' => array('Group' => array('Location')), 
+0

嘗試過,但沒有成功。 – drpudding 2013-03-20 16:16:18

+0

如果您用''GroupX''替換''Group'',您在登錄時是否出現錯誤?其實通過再次查看你的代碼,我想知道它是否被使用,因爲''fields''鍵應該配置用於登錄的用戶字段,而在你的配置中似乎不是這種情況。 – nIcO 2013-03-20 19:50:08

+0

是 - 將組更改爲不存在的模型會導致預期的結果:模型「用戶」與模型「Groupx」沒有關聯。我刪除了字段數組,這是不正確的,但它並沒有改變結果。 – drpudding 2013-03-20 22:11:36