Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] jAuth et CRUD : possible ?

Posted by PomCompot on 05/13/2009 15:51

Bonjour,

Je me suis aperçu que l'application que je développe avec Jelix en lieu et place de stocker les mots de passe cryptés en MD5, les stockent en clair. En effet, je pensais naïvement pouvoir utiliser un CRUD pour le formulaire de création d'utilisateur, mais il apparaît qu'il faut en fait passer par la méthode jAuth::createUser().

Est-il donc possible d'allier le meilleur des deux mondes en utilisant le CRUD et les facilités de jAuth ? En surchargeant par exemple les méthodes _beforeSaveCreate et _beforeSaveUpdate pour faire un appel à jAuth ?

Merci d'avance.

  [Opened] Re: jAuth et CRUD : possible ?

Reply #1 Posted by bballizlife on 05/14/2009 08:12

Bonjour,

Tu fais bien ce que tu veux au final tu sais. Les méthodes _beforeSave*() sont là pour être surchargée et pour y définir des traitements spécifiques aux besoins.


N'importe comment c'est dans la doc

  [Opened] Re: jAuth et CRUD : possible ?

Reply #2 Posted by PomCompot on 05/14/2009 09:27

Merci pour cette réponse, mais tu ne m'y apprends rien de bien nouveau. Je savais justement que les 2 méthodes en questions permettent de surcharger les traitements effectués par le CRUD, mais je ne savais pas comment le faire, ni comment déléguer l'encryption du mot de passe à jAuth. Je me suis penché sur le code de jAuth, db.auth.php et jControllerDaoCrud pour comprendre.

Je suis parvenu au résultat escompté avec le code suivant si cela peut en intéresser certains :

 public function _beforeSaveCreate($form, $form_daorec) {
   $user = jAuth::createUserObject($form_daorec->login, $form_daorec->password);
   $form_daorec->password = $user->password;
 }

 public function _beforeSaveUpdate($form, $form_daorec, $id) {
  $user = jAuth::createUserObject($form_daorec->login, $form_daorec->password);
  $form_daorec->password = $user->password;
 }

Je ne sais pas si c'est la solution idéale, mais elle marche et me permet de coupler sans peine le CRUD et jAuth.

Merci quand même et à bientôt.

  [Opened] Re: jAuth et CRUD : possible ?

Reply #3 Posted by PomCompot on 05/14/2009 11:34

Merci pour le 'n'importe quoi' :). Bon, sans vouloir vexer personne, je n'ai pas pour habitude de me faire assister et préfère grandement m'en sortir par moi-même en regardant la doc. Si celle-ci avait été suffisamment claire, je n'aurai pas posé cette question :). En fait, il manque dans la documentation de jAuth, la mention de l'utilisation des fonctions createUserObject et saveNewUser. Certes, on n'en parle dans l'API, mais ce n'est pas évident.

Sinon, j'ai un problème avec le code que tu me proposes. J'avais pensé faire ça au départ, mais là j'utilise un CRUD, donc la fonction _beforeSaveCreate va être appelée avant que le CRUD insère lui-même l'enregistrement comme l'indique l'extrait de code suivant (tiré de jControllerDaoCrud.class.php) :

 $this->_beforeSaveCreate($form, $form_daorec);
 $form_dao->insert($form_daorec);
 $id = $form_daorec->getPk();
 $form->saveAllFiles($this->uploadsDirectory);
 $rep->action = $this->_getAction('view');
 $this->_afterCreate($form, $id, $rep);

Or, la méthode saveNewUser du driver DB jAuth insère également un enregistrement comme le montre l'extrait de code suivant (tiré de db.auth.php) :

 public function saveNewUser($user){
   $dao = jDao::get($this->_params['dao'], $this->_params['profile']);
   $dao->insert($user);
   return true;
 }

Pour ne pas parler dans le vide, j'ai donc testé le code que tu me proposes et j'obtiens, comme je m'y attendais, 2 enregistrements pour le même utilisateur dans la base (un créé par la méthode saveCreate du CRUD, un créé par la méthode saveNewUser du driver jAuth). Ce qui est finalement logique.

Pour synthétiser, si on couple jAuth et CRUD, il est impossible de shunter l'insertion de l'enregistrement par le CRUD et de ne passer que par jAuth. La seule solution est donc ne passer partiellement par jAuth (avec createUserObject pour obtenir un mot de passe crypter) et de laisser le controller CRUD insérer l'enregistrement (avec la valeur du champ password du formulaire préalablement remplacée par le mot de passe crypté renvoyé par jAuth).

Voilà pourquoi je garde pour l'instant mon code, même si c'est n'importe quoi ;). Bien entendu, s'il y a une solution plus esthétique qui marche, je suis preneur.

  [Opened] Re: jAuth et CRUD : possible ?

Reply #4 Posted by PomCompot on 05/14/2009 13:52

Ne t'inquiète pas, je n'ai pas du tout mal pris tes propos teintés d'humour.

Pour la doc, je pense effectivement à rajouter ce point. Je dois effectuer une livraison de mon projet ce soir pour recette, donc je suis un peu pris. Mais, je vais tenter de le faire prochainement.

Sinon, très bonne idée que celle de lancer l'évènement dans le afterCreate(). Juste à regarder comment savoir si le CRUD a pu ou non créer l'enregistrement pour ne pas lancer l'évènement par mégarde.

Je vais essayer d'arrêter de torturer le CRUD, mais ça reste tentant, il est tellement pratique.

  [Opened] Re: jAuth et CRUD : possible ?

Reply #5 Posted by laurentj on 05/15/2009 22:03

Salut,

juste une remarque. Il y a déjà un module de gestion des users fourni avec jelix. jauth_db_admin... Si ça peut t'éviter de réinventer la roue...

Pour le changement du mot de passe, il faut passer par les methodes adéquates de jAuth: changePassword.

 
Page
  1. jAuth et CRUD : possible ?