CakePHP 2.0.5 Auth和用户模型递归问题

时间:2012-01-05 00:50:57

标签: cakephp authentication cakephp-2.0

在Cake 2.0.5中使用Auth组件登录时,似乎Cake正在检索所有相关模型;登录需要很长时间。

此问题首先在this ticket中确定,但"解决方案"鉴于并不意味着很多,我在文档中找不到任何其他内容。

  

使用2.0中的FormAuthenticate类,您可以进行子类化和添加   无论你认为哪种递归级别相当容易。

有没有人经历过这个,并有一个修复?

下面 - 示例代码:

标准登录方式:

public function login() {
    $this->User->recursive = -1; // does nothing

    if ($this->Auth->login()) {
        $this->redirect($this->Auth->redirect());
    } else {
            $this->Session->setFlash('Invalid username or password.');
    }

}

查询蛋糕正在为我的应用程序生成:

SELECT `User`.`id`, `User`.`username`, `User`.`password`, `User`.`role`, `User`.`created`, `User`.`modified`, `Band`.`id`, `Band`.`name`, `Band`.`genre`, `Band`.`location`, `Band`.`influences`, `Band`.`founded`, `Band`.`bio`, `Band`.`created`, `Band`.`modified`, `Band`.`status`, `Band`.`website`, `Band`.`email`, `Band`.`contact_number`, `Band`.`user_id`, `Member`.`id`, `Member`.`user_id`, `Member`.`first_name`, `Member`.`last_name`, `Member`.`display_name`, `Member`.`dob`, `Member`.`gender`, `Member`.`bio`, `Member`.`influences`, `Member`.`band_id` FROM `users` AS `User` LEFT JOIN `bands` AS `Band` ON (`Band`.`user_id` = `User`.`id`) LEFT JOIN `members` AS `Member` ON (`Member`.`user_id` = `User`.`id`) WHERE `User`.`username` = 'admin' AND `User`.`password` = 'dcec839a9258631138974cbccd81219f1d5dfcfa' LIMIT 1

您可以看到它检索每个字段,并加入每个模型。我的应用只有2个额外的关联,但你可以看到这可能是一个非常复杂的应用程序的问题。

真的,它应该只是用户表。设置recursive似乎绝对没有。

3 个答案:

答案 0 :(得分:2)

您可以对Auth组件使用递归选项。

public $components = array(
    'Auth' => array(
        'authenticate' => array(
            'Form' => array('recursive' => -1)
        )
    )

beforeFilter 方法:

$this->Auth->authenticate = array('Form' => array('recursive' => -1));

答案 1 :(得分:1)

Mark建议的是扩展FormAuthenticate类,或者基本上覆盖它。

创建新文件app/Controller/Component/Auth/ExtendedFormAuthenticate.php

这是代码的基本结构 - 我留在了 _findUser 方法中设置递归级别的重要位:

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

class ExtendedFormAuthenticate extends FormAuthenticate
{
  public function authenicate(CakeRequest $request, CakeResponse $response) {
    // foo
  }

  protected function _findUser($username, $password)
  {
    // bar

        $result = ClassRegistry::init($userModel)->find('first', array(
            'conditions' => $conditions,
            'recursive' => -1
        ));

    // fooBar
  }
}

我已经在https://gist.github.com/1565672

创建了一个Gist

哦,差点忘了,你需要设置AuthComponent才能使用扩展类。

public $components = array(
  'Auth'=> array(
    'authenticate' => array(
      'ExtendedForm'
    )
  ),
);

答案 2 :(得分:0)

如何使用Containable并覆盖模型中的find? Modifying Containable fields required in beforeFind callback?