2 votes

CakePHP 2.0.5 Auth et modèle utilisateur : problème récursif

Dans Cake 2.0.5, lorsque l'on se connecte à l'aide du composant Auth, il semblerait que Cake récupère tous les modèles associés ; et avec de nombreuses associations, la connexion prend beaucoup de temps.

Ce problème a été identifié pour la première fois ici dans ce billet mais la "solution" donnée ne veut pas dire grand chose, et je ne trouve rien d'autre dans la documentation.

En utilisant la classe FormAuthenticate dans 2.0, vous pouvez sous-classer et ajouter tout niveau récursif que vous jugez approprié assez facilement.

Quelqu'un a-t-il rencontré ce problème et a-t-il trouvé une solution ?

Ci-dessous - exemple de code :

Méthode de connexion standard :

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.');
    }

}

Et le gâteau de requêtes est produit pour mon application :

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

Comme vous pouvez le voir, il récupère chaque champ, et joint chaque modèle. Mon application n'a que deux associations supplémentaires, mais vous pouvez voir comment cela pourrait être un problème avec des applications très complexes.

Alors qu'en réalité, il ne devrait s'agir que de la table des utilisateurs. Réglage de recursive semble ne rien faire du tout.

2voto

hdogan Points 274

Vous pouvez utiliser récursif pour le composant Auth.

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

ou dans beforeFilter méthode :

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

1voto

Moz Morris Points 2736

Ce que Mark suggère est d'étendre la classe FormAuthenticate, ou essentiellement de la surcharger.

Créer un nouveau fichier app/Controller/Component/Auth/ExtendedFormAuthenticate.php

Il s'agit de la structure de base du code - j'ai laissé la partie importante où le niveau récursif est défini dans le fichier _findUser méthode :

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
  }
}

J'ai créé un Gist avec le tout : https://gist.github.com/1565672

Oh, j'allais oublier, vous devrez configurer le composant AuthComponent pour utiliser la classe étendue.

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

0voto

colares Points 70

Qu'en est-il de l'utilisation de Containable et de la substitution de find au modèle ? Modifier les champs Containable requis dans la callback beforeFind ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X