在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
似乎绝对没有。
答案 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?