CakePHP 2.0.5 Auth и модель пользователя Рекурсивная проблема - PullRequest
2 голосов
/ 05 января 2012

В Cake 2.0.5 при входе в систему с использованием компонента Auth может показаться, что Cake извлекает все связанные модели; и со многими ассоциациями вход в систему занимает много времени.

Эта проблема была впервые обнаружена здесь, в этом билете , но данное "решение" не имеет большого значения, и я не могу найти ничего другого в документации.

Используя класс FormAuthenticate в 2.0, вы можете создать подкласс и добавить любой рекурсивный уровень, который вы чувствуете, подходит довольно легко.

Кто-нибудь испытывал это, и есть исправление?

Ниже - пример кода:

Стандартный метод входа:

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 ]

2 голосов
/ 17 марта 2013

Вы можете использовать рекурсивную опцию для компонента Auth.

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

или в beforeFilter метод:

$this->Auth->authenticate = array('Form' => array('recursive' => -1));
1 голос
/ 05 января 2012

Марк предлагает расширить класс 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
  }
}

Я создал Gist со всем лотом: https://gist.github.com/1565672

О, почти забыл, вам нужно настроить AuthComponent для использования расширенного класса.

public $components = array(
  'Auth'=> array(
    'authenticate' => array(
      'ExtendedForm'
    )
  ),
);
0 голосов
/ 18 февраля 2012

Как насчет использования Containable и переопределения find в модели? Изменение Обязательных полей, необходимых для обратного вызова beforeFind?

...