2013-03-20 33 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