Authentification à double entrée avec CakePHP 1.3
Nous faisons d’une pierre deux coups avec cet article : d’une part nous mettons à jour un ancien article sur l’authentification en proposant une approche plus « propre », d’un point de vue POO, de l’utilisation du composant Auth, et d’autre part la sortie de la version 1.3.0-alpha et son nouveau système de gestion des Routes préfixées nous permet de décrire la mise en place très simple d’un système d’authentification à double entrée (ou plus), du type /admin et /membres.
1. Problématique
Le projet que nous imaginons nécessite une partie publique accessible à tous, un panneau d’administration accessible par /admin et une partie réservée aux membres, accessible par /membres. Ces deux groupes d’utilisateurs nécessitent d’être identifiés, mais nous n’ajoutons pas de granularité supplémentaire (pas de sous-groupes avec des droits d’accès distincts) qui nécessiterait les ACL, solution beaucoup plus lourde à mettre en place.
2. Création des tables, modèles et contrôleurs
2.1 Les tables
Nous allons créer deux tables distinctes pour gérer les admins et les membres, avec un utilisateur dans chaque (nous utilisons la clé de sécurité du fichier config/core.php ligne 212 pour encoder les mots de passe) :
CREATE TABLE IF NOT EXISTS `users` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `login` VARCHAR(12) NOT NULL, `password` CHAR(40) NOT NULL, `disabled` tinyint(1) UNSIGNED NOT NULL DEFAULT '0', `created` datetime NOT NULL, PRIMARY KEY (`id`) ); INSERT INTO `users` VALUES (1, 'admin', SHA1('[ici la clé]admin'), 0, NOW()); CREATE TABLE IF NOT EXISTS `members` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `email` VARCHAR(100) NOT NULL, `password` CHAR(40) NOT NULL, `nom` VARCHAR(30) NOT NULL, `prenom` VARCHAR(30) NOT NULL, `disabled` tinyint(1) UNSIGNED NOT NULL DEFAULT '0', `created` datetime NOT NULL, PRIMARY KEY (`id`) ); INSERT INTO `members` VALUES (1, 'pierre.fringant@gmail.com', SHA1('[ici la clé]pierre'), 'FRINGANT', 'Pierre-Emmanuel', 0, NOW());
La table users contiendra les administrateurs, identifiés par un login et un mot de passe, et la table members contiendra les membres identifiés par leur adresse email et un mot de passe.
2.2 Les modèles
Nous ne créons même pas les modèles maintenant (Cake va les créer virtuellement tant que nous ne les avons pas créé explicitement dans un fichier php), mais le lecteur pourra bien évidemment ajouter les règles de validation qui s’imposent.
2.3 Les contrôleurs
Nos deux contrôleurs ne vont pour l’instant contenir qu’une seule action vide, la page d’accueil de chaque espace :
// /controllers/users_controller.php class UsersController extends AppController { function admin_home() { } }
// /controllers/members_controller.php class MembersController extends AppController { function membres_home() { } }
2.4 Les vues
Nous créons les deux vues correspondantes aux actions, là encore le strict minimum :
// /views/users/admin_home.ctp <p>Bienvenue cher administrateur !</p>
// /views/members/membres_home.ctp <p>Bienvenue cher membre !</p>
3. Définition des préfixes
Nous allons définir les deux préfixes que nous voulons gérer dans le fichier config/core.php, ligne 102 :
Configure::write('Routing.prefixes', array('admin', 'membres'));
Ajoutons ensuite deux routes dans le fichier config/routes.php qui amènent respectivement à l’accueil de l’administration (contrôleur Users, action admin_home) et à l’accueil des membres (contrôleur Members, action membres_home) lorsque l’URL appelée est /admin ou /membres :
Router::connect( '/admin', array('controller' => 'users', 'action' => 'home', 'prefix' => 'admin') ); Router::connect( '/membres', array('controller' => 'members', 'action' => 'home', 'prefix' => 'membres') );
Nous pouvons d’ors et déjà tester le bon fonctionnement de ce routage nous rendant sur /admin ou /membres.
4. Extension du composant Auth
Dans notre premier article sur Auth, nous avions choisi la facilité en suivant simplement les instructions du Cookbook. Or nous pouvons tirer parti d’un concept important de la programmation orientée objet qu’est l’héritage de classe. Cake repose beaucoup sur ce principe : par exemple tous nos modèles héritent de la classe mère Model, ils ont donc accès à toutes les variables et toutes les méthodes de cette classe (Model::save(), Model::find(), etc.), et nous pouvons spécialiser un modèle particulier avec des méthodes bien à lui, ou redéfinir une propriété ou une méthode de la classe mère.
Dans le cas du composant Auth, nous allons raisonner comme avec nos modèles habituellement : nous allons créer une nouvelle classe AppAuthComponent qui hérite de la classe AuthComponent, et la spécialiser avec les propriétés et les traitements spécifiques aux besoins de notre application et elle seule.
<?php // app/controllers/components/app_auth.php App::import('Component', 'Auth'); class AppAuthComponent extends AuthComponent { /** * Configuration par défaut * * @var array */ var $defaults = array( 'userModel' => 'User', 'userScope' => array(), 'fields' => null, 'loginAction' => null, 'loginRedirect' => null, 'logoutRedirect' => null, 'autoRedirect' => true, 'loginError' => "Identifiant ou mot de passe incorrects.", 'authError' => "Vous n'avez pas accès à cette page.", 'flashElement' => 'default', ); /** * Configurations possibles en fonction du préfixe de la route * * @var array */ var $configs = array( 'admin' => array( 'userModel' => 'User', 'userScope' => array('User.disabled' => 0), 'fields' => array('username' => 'login', 'password' => 'password'), 'loginAction' => array('controller' => 'users', 'action' => 'login', 'admin' => false), 'loginRedirect' => array('controller' => 'users', 'action' => 'home', 'admin' => true), 'logoutRedirect' => array('controller' => 'users', 'action' => 'login', 'admin' => false), 'flashElement' => 'admin_notice', ), 'membres' => array( 'userModel' => 'Member', 'userScope' => array('Member.disabled' => 0), 'fields' => array('username' => 'email', 'password' => 'password'), 'loginAction' => array('controller' => 'members', 'action' => 'login', 'membres' => false), 'loginRedirect' => array('controller' => 'members', 'action' => 'home', 'membres' => true), 'logoutRedirect' => array('controller' => 'members', 'action' => 'login', 'membres' => false), 'flashElement' => 'public_notice' ), ); /** * Démarrage du composant. * Autorisation si pas de préfixe dans la Route qui a conduit ici. * * @param object $controller Le contrôleur qui a appelé le composant. */ function startup(&$controller) { $prefix = null; if(empty($controller->params['prefix'])) { $this->allow(); } else { $prefix = $controller->params['prefix']; } // Cas spécial des actions de login et logout, pour lesquelles le préfixe n'existe pas if(in_array($controller->action, array('login', 'logout'))) { switch($controller->name) { case 'Users': $prefix = 'admin'; break; case 'Members': $prefix = 'membres'; break; } } $this->_setup($prefix); parent::startup($controller); } /** * Définition des variables de config en fonction d'un préfixe * * @param string $prefix */ function _setup($prefix) { $settings = $this->defaults; if(array_key_exists($prefix, $this->configs)) { $settings = array_merge($settings, $this->configs[$prefix]); } $this->_set($settings); } } ?>
Voyons ce qui se passe :
- Nous commençons par importer le composant Auth fourni par Cake ;
- Nous créons la nouvelle classe en héritant de
AuthComponent; - Nous définissons des réglages par défaut, avec certaines propriétés communes aux deux espaces ;
- Nous définissons un tableau de réglages, cette fois spécifiques à chaque espace, groupés par préfixe ;
- Nous redéfinissons le comportement de la méthode
startup()qui existe déjà dans la class mèreAuthComponent, en lui demandant d’autoriser l’accès si l’URL demandée ne contenait aucun préfixe (partie publique) puis d’appeler la méthode_setup()avec le préfixe (nous décrirons cette méthode juste après). Nous reprenons le cours normal de la classe mère en appelant sa méthodestartup()à elle. - La méthode
_setup()prend en paramètre le préfixe trouvé dans la Route, vérifie qu’il existe un tableau de réglages correspondant dans la variable$configs, l’ajoute aux réglages par défaut et appelle la méthode_set(). Cette méthode appartient à la classe Objet dont héritent presque toutes les classes de CakePHP (dont AuthComponent) et permet de définir plusieurs attributs d’un objet d’un seul coup en passant en paramètres un tableau contenant des couples'attribut' => 'valeur'.
5. Appel du composant AppAuth
Il suffit d’inclure le composant que nous venons de créer dans le contrôleur général AppController :
// /app_controller.php class AppController extends Controller { var $components = array('AppAuth'); }
Si cette fois nous appelons l’adresse /admin ou /members, Cake nous demande de créer un action login() dans le contrôleur appelé, ce qui montre qu’il protège bien l’accès à nos deux espaces ! Pour protéger une action d’admin ou de membre, il suffit de préfixer le nom de l’action avec le préfixe de l’espace suivi d’un underscore, imaginons par exemple un contrôleur Articles avec une action admin_delete réservée aux administrateurs et une action membres_edit réservée aux membres.
6. Login et logout
Il ne nous reste qu’à créer les actions de connexion et de déconnexion de chaque espace (le composant se charge de presque tout !) :
// /controllers/members_controller.php class MembersController extends AppController { function login() { } function logout() { $this->redirect($this->AppAuth->logout()); } ...
// /controllers/users_controller.php class UsersController extends AppController { function login() { } function logout() { $this->redirect($this->AppAuth->logout()); } ...
Ainsi que les formulaires de connexion associés :
// /views/members/login.ctp <h2>Accès Membres</h2> <?php echo $this->Session->flash('auth'); echo $this->Form->create('Member'); echo $this->Form->input('email', array('label' => "Email :")); echo $this->Form->input('password', array('label' => "Mot de passe :")); echo $this->Form->end("Connexion"); ?>
// /views/users/login.ctp <h2>Accès Admin</h2> <?php echo $this->Session->flash('auth'); echo $this->Form->create('User'); echo $this->Form->input('login', array('label' => "Identifiant :")); echo $this->Form->input('password', array('label' => "Mot de passe :")); echo $this->Form->end("Connexion"); ?>
Le lecteur aura noté la nouvelle façon d’appeler les Helpers comme $this->Form->input() au lieu de $form->input(), introduite dans le version 1.3. L’ancienne notation reste cependant tout à fait valide.
7. Différents layouts
Il est tout à fait envisageable que la présentation de nos deux espaces soit totalement différente de la partie publique, et même différents entre eux. Il suffit de créer différents layouts dans le dossier /views/layouts et de les assigner à chaque espace dans la méthode beforeRender() du contrôleur général :
class AppController extends Controller { function beforeRender() { if(!empty($this->params['prefix'])) { $this->layout = $this->params['prefix']; } } }
Avec ce simple exemple, nous devrions créer deux fichiers /views/layouts/admin.ctp et /views/layouts/membres.ctp.
Commentaires
7 novembre 2009 à 15:51
Bonjour Pierre-Emmanuel! Encore un tuto qui m’a beaucoup aidé! Merci beaucoup
Par contre j’ai un petit problème au niveau de l’authentification (que j’avais déjà avec le tuto précédent). Lorsque je me connecte il est marqué « Identifiant ou mot de passe incorrects. ». En regardant la requête SQL lors de la connexion, le mot de passe converti en SHA1 est pourtant bien le même.
De plus j’ai une erreur SQL dès la connexion: Warning (512): SQL Error: 1054: Unknown column ‘User.disabled’ in ‘where clause’ [CORE/cake/libs/model/datasources/dbo_source.php, line 581]
PS: je suis chez OVH
7 novembre 2009 à 16:35
Bien entendu il faut adapter mon exemple à la situation, ici le champ ‘disabled’ dans ma table permet de dire si un user est actif ou non, mais tu n’as peut-être pas ce besoin ! Dans ce cas tu n’as qu’à mettre le ‘userScope’ à null
16 novembre 2009 à 19:45
Hello Pierre-Emmanuel, vraiment un excellent tutorial pour mettre en place l’authentification. (ainsi que tes autres tutos très pratique)
Par contre je rencontre 2 soucis au final : 1) Si je loggue l’utilisateur correctement il n’y a pas de message d’erreur (ok correct) mais il me redirige pas sur la page indiquée dans app_auth.
2) Je ne sais pas si ça à avoir, mais si à présent depuis mon controller je tente de faire un Hachage en passant par AppAuth il ne crypte plus le mot de passe.
17 novembre 2009 à 15:36
1) Tout à fait, j’ai le même souci pour la partie membres uniquement. J’ai du mettre l’autoRedirect à false et ajouter ceci dans l’action MembersController::login :
17 novembre 2009 à 19:27
Merci effectivement c’est ce qu’il fallait faire.
Pour le password, j’avais procédé aussi ainsi en attendant. Je voulais être sûr que c’était la bonne manière de procéder
19 novembre 2009 à 1:17
En fait ma réponse au 1) fait une boucle infinie dans certaines conditions, j’ai donc modifié par ceci, toujours avec le paramètre « autoRedirect » à false :
20 novembre 2009 à 17:21
Super tuto !!! Merci encore ! Une petite question quand même : Comment implémenter les autres controllers (de l’espace Admin par exemple) ?
ex : le controller admin_add ne fonctionne pas via l’url /Admin/add.
30 janvier 2010 à 20:05
Bonjour, je souhaitais savoir à quoi correspondait le 3eme paramètre de ce code (app_auth.php) :
SI je laisse le ‘membres’=>true, j’obtiens une adresse du genre « http://127.0.0.1/cake_monsite/Members/home/membres:1″ ainsi qu’une erreur de méthode manquante dans le controller Members. En le passant à false pas de problème mais j’aimerais tout de même comprendre ?
31 janvier 2010 à 23:06
Bonsoir, c’est encore moi, je lis et relis ce tuto et je me pose pas mal de questions. Mais rassurez vous, je n’en poserais qu’une ce soir. Une fois connecté sur mon site, pour chaque méthode ajoutée au controller, dois-je ajouter la ligne correspondante dans le fichier config/routes.php ? Si c’est le cas, ceci peux vite devenir un peu « lourd » et si ce n’est pas le cas, j’ai du louper un truc… ?!
1 février 2010 à 8:55
Le troisième paramètre ici est le préfixe de l’url. On aura ici la route par défaut /membres/members/home, qui pointera vers l’action « membres_home » du controller « MembersController »
1 février 2010 à 8:56
Pas du tout, il ne faut créer une route que si l’on souhaite changer le comportement par défaut.
1 février 2010 à 21:34
Je ne sais pas si on s’est bien compris ? Dans mon cas, je dois donné accès à des clients à une liste de fichiers. lorsque je saisi l’url : http://127.0.0.1/cakemonsite/client/listerfichiers/
Cake php recherche le controller client (Error: ClientController could not be found.) Effectivement il n’existe pas puisque c’est ClientsController. La route est
Router::connect(‘/client’, array(‘controller’ => ‘clients’, ‘action’ => ‘home’, ‘prefix’ => ‘client’));
Mais de ce que j’en comprends, lorsque cake php trouve le prefix « /client » dans l’url, il redirige vers la méthode clienthome. Mais pour les autres méthodes (ex. clientlister_fichiers), c’est la que je me demande si je dois créer une route :
Router::connect(‘/client/listerfichiers’, array(‘controller’ => ‘clients’, ‘action’ => ‘listerfichiers’, ‘prefix’ => ‘client’));
Le mystère reste entier ?
5 février 2010 à 16:23
Bonjour, je voudrais savoir si pour l’authentification (sans double entrée, sans créer appAuth), c’est le meme processus entre cake 1.2 et cake 1.3, car je rencontre quelques problèmes.
Merci
9 février 2010 à 6:50
Bonjour. Deja merci bien pour ce tuto qui m’a bien facilité la vie par rapport aux acl. j’ai 2 questions : - Niveau securité, cette méthode est-elle satisfaisante ? - Dans un de mes controllers, je dois afficher toutes les entrées concernant l’utilisateur loggué. Comment puis-je procéder ? (j’ai vu que dans la variable session, il n’y avait rien de stocké sur l’utilisateur (enfin pas son ID ni son email))
10 février 2010 à 9:27
Niveau sécurité oui, aucun souci de ce côté. Pour récupérer les infos sur l’utilisateur logué, on peut avoir son ID avec $this->AppAuth->user(‘id’));
25 février 2010 à 8:35
Re hello,
Est-ce que tu aurais une idée à quel niveau peut se trouver mon blocage.
Des actions ne sont pas accessibles lorsque l’utilisateur n’est pas connecté (ok ça marche ça me renvoie au login).
Une fois l’utilisateur logué (j’ai 3 groupes différents d’utilisateurs), chacun arrive à accéder aux actions qui sont en fait réservées aux autres groupes. Comme si une fois logué, peut importe le groupe, l’utilisateur dispose de full contrôle sur tout le site…
Pourtant le préfixe du groupe est mentionné sur le lien, et sur l’action du controller…
une idée ?
27 février 2010 à 19:03
Aïe aïe aïe … pour moi rien ne va.
Je découvre cake depuis quelques jours et c’est presque du chinois pour moi.
J’arrive jusqu’à la création de la class « nous allons créer une nouvelle classe AppAuthComponent »
Mais pas moyen de savoir ou la mettre
du coup je ne la mets pas au bon endroit et mon cake par en fusion.
Si vous aviez des tuto plus basique (en français dans le texte of course!) vous seriez mes grands sauveurs.
Merci Manuel
8 mars 2010 à 12:43
Bonjour, Merci beaucoup pour le tuto et merci d’avance également pour votre aide. En effet j’ai un souci: j’ai bien suivi le tuto à la lettre et tout semble bien fonctionner sauf une seule chose, il s’agit des messages d’erreur lors de la connection à « admin » ou « membres ». Ces messages ne s’affichent pas… si quelqu’un pouvait bien m’éclairer?
Merci Chris
9 mars 2010 à 13:11
Bonjour,
J’ai suivi le tutoriel (qui ma grandement aidé en passant) et j’ai un problème pour la partie ‘membres’ (que j’ai renommée ‘manager’).
Après l’authentification sur la partie admin, tout se passe sans problème. Mais en ce qui concerne la partie ‘manager’, les formulaires semblent ‘perdre’ le préfix et me redirigent vers les actions de base des controlleurs (monsite/controlleur/action au lieu de monsite/manager/controlleur/action).
Merci d’avance, Munkey
9 mars 2010 à 15:15
Euuuu je crois avoir trouvé, est-ce que ce tuto marche pour la version 1.2 de CakePHP ? -_-’
20 mars 2010 à 17:32
Bonjour oui tu demande de créer une class AppAuthComponent , faut aller au bout des choses dans un tuto parceque la je sais pas ou mettre cette classe
21 mars 2010 à 3:57
Lol j’ai vus que mon commentaire à été effacé tous ça parceque j’ai précisé un manque de détail sur une classe .Pas trés gallant de faire ça MDR
22 mars 2010 à 17:22
Dans app/controllers/components/app_auth.php
Il faudrait peut-être chercher un peu avant de critiquer les personnes qui prennent le temps d’écrire de tels tutos.
22 mars 2010 à 17:23
@Munkey : effectivement le tuto ne marche qu’avec la branche 1.3…
@titi : pas du tout, c’est juste que je mets parfois un moment avant de valider les (nombreux) commentaires. La classe AppAuthComponent doit se trouver dans le fichier app_auth.php, à créer dans le dossier {app}/controllers/components/
31 mars 2010 à 12:27
Bonjour,
J’observe un bug inquiétant, je m’explique:
Ma partie Admin (préfix : ‘admin’) utilise la table ‘administrators’
Ma partie Manager (préfix : ‘manager’) utilise la table ‘users’
Pour accéder à l’administration, je peux utiliser le login d’un User ce qui n’est pas normal (la connexion avec un profil administrateur marche également).
Pour accéder au manager je peux utiliser un login Administrateur et User.
Ceci pose un sérieux problème de sécurité et je n’arrives pas à le résoudre.
Quelqu’un a une idée?
Munkey
7 avril 2010 à 13:46
salut, juste pour dire que cela fonctionne parfaitement, encore merci
J’ai par contre noté un petite erreur d’inattention dans la dernière manip,
une parenthèse n’est pas fermée.
Cordialement.
20 mai 2010 à 11:31
Bonjour,
j’ai suis l’article : http://www.formation-cakephp.com/31/interface-dadministration-dun-site-cakephp-avec-le-composant-auth et j’ai crée un espace pour l’administration avec l’authentification mais maintenant je veux créer un espace pour les membres pour ajouter des commentaires par exemple après authentification . La problematique c’est comment je vais adapter le travail que j’ai réaliser avec l’article mentionné dessus et cet article à double entrée surtout que j’utilise la version 1.2.5 de cakephp.
Merci d’avance Boulboul
25 mai 2010 à 21:37
Salut,
Attention, si vous n’utilisez pas d’userScope pour vérifier si l’utilisateur est disabled ou pas (comme dans l’exemple), vous devez définir tout de même userScope comme un array (sinon, une erreur se produira et tout le monde pourra se connecter avec n’importe quels identifiants).
Il faut donc entrer :
au lieu de
26 mai 2010 à 7:54
On doit pouvoir arriver au même résultat avec la branche 1.2, mais moins facilement qu’avec la 1.3 comme expliqué dans le tuto. Ceci dit, si tu regardes le guide de migration du Cookbook pour passer de la 1.2 à la 1.3, peut-être peux-tu migrer facilement l’application existante ? La 1.3 apporte son lot d’améliorations sympathiques.
26 mai 2010 à 8:00
Merci pour l’info
26 mai 2010 à 17:03
Merci beaucoup pour l’histoire du « UserScope » !
26 mai 2010 à 17:09
Pire important, avec un site en production je me suis aperçu que le back-office n’était pas sécurisé et effectivement le userScope était en cause, mais j’avais pensé à une erreur de ma part
15 juin 2010 à 16:54
bonjour et merci pour ce tuto
je suis allée jusqu’au bout mais je rencontre 2 soucis:
en admin: quelque soit le mot de passe il ne se passe rien à l’écran, ni message ni redirection
partie membres: j’ai un joli MissingController
LoginController ne peut pas être trouvé et me demande de créer la classe
je suis sur la branche 1.3 de CakePHP
j’ai la tête bien farcie de PHP ce soir et je n’arrive pas à trouver mon erreur
bonne soirée
Deedo
16 juin 2010 à 11:27
bonjour
j’ai finallement résolu mon soucis: j’avais un problème de cache et une mise à jour de mon controller n’avait pas été pris en compte
donc le soucis du jour est: quand je me connecte en admin ou memebre aucune redirection et aucun message si je tape un code erroné (mais je vois bien l’exec de ma requete dans le debug)
donc j’ai suivi les instructions pour la fonction login dans le memberscotroller.php avec redirect à false dans le appauth.php
et maintenant quand je clique sur connexion j’ai le message d’erreur suivant:
Fatal error: call of a memeber function check() on a nonobject in c:\wamp…\app\controllers\memberscontroller.php on line 10:
il bloque donc sur : if($this->Session->check(‘Auth.Member.id’))
je vous remercie de m’aider je suis désespérée! mais je veux pas lacher cake pour mon projet :p
Deedo
16 juin 2010 à 11:31
j’ai oubli un détail important la ligne erreur supérieur.. il ne reconnait pas la variable $session
Undifined property: MembersController::$session
désolé pour le spam de posts
21 juin 2010 à 14:06
Vraiment très bon tuto! Juste 2 problèmes pour moi, 1 -
} Cela me fait une boucle infini lorsque je viens de l'extérieur et que je me connecte directement à l'adresse /members/login
2- L'utilisation de la fonction AppAuth->login() ne fonctionne pas ici:(pour connecter la personne dés que le compte est créé).
En tout cas très bon tuto même s'il me reste 2 zones d'ombres.
25 juin 2010 à 21:21
J’ai réslou le 2e problème pour ceux que cela intéresserai: il faut appeler la fonction _setup avant la fonction login.
29 juin 2010 à 16:25
Bonjour, vraiment très bon tuto mais je rencontre juste un problème. Les messages d’erreur dans la partie authentification des membres et admins ne s’affichent pas quand on entre n’importe quelles valeurs dans les champs. J’ai beau avoir essayé de bidouiller mais ça ne marche pas.
Merci de votre aide !
29 juin 2010 à 16:56
Il faut bien mettre echo $this->Session->flash(‘auth’); dans la vue de login.
29 juin 2010 à 19:32
Merci beaucoup ! J’avais oublié le echo (erreur d’etourderie :/)
9 août 2010 à 11:02
Merci pour ce tuto. Je reviens juste sur le hashage des mots de passe. <pre lang= »php>Security::hash($password, null, true);
Lorsque j'utilise ce code dans mon controlleur, j'obtiens : Class 'Security' not found.
J'ai essayé en rajoutant la class Security dans App::import mais rien n'y fait.
3 septembre 2010 à 19:04
J’aimerais savoir comment faire pour savoir par exemple sur la page membre si un admin est logué et vis versa car j’aimerais qu’on ne puisse pas se loguer sur les deux parti en meme temps. De plus, j’aimerais que sur ma page d’accueil, je puisse savoir qui est logué.
Merci d’avance pour votre aide !
20 septembre 2010 à 7:39
Bonjour et merci pour ce tutoriel. J’ai deux problèmes que je n’arrive pas à régler.
1) lorsque j’arrive sur les pages de login, j’ai systématiquement le message « Identifiant ou mot de passe incorrects. » qui ne s’en va que si je rafraichis la page.
2) je n’arrive pas à me logguer, comme si je n’entrais jamais le bon mot de passe…
Merci de votre aide!
20 septembre 2010 à 13:50
Personne ne sais faire ca?
20 septembre 2010 à 13:59
Il y a des problèmes de cohérence et de logique qui me gènent dans ce tutoriel:
les « administrateurs » sont dans la table des « utilisateurs » (users)
les « membres » sont dans la table « members ».
Pourquoi ne pas créer une seule table « users », et la lier à une autre table « groupes » contenant les valeurs « admin » et « members » comme dans le tutoriel cakephp?
De plus, c’est codé partout en anglais, sauf l’utilisation partielle du mot « membre » en Français, qui apparaît partout dans le code, du coup c’est un micmac pas possible les mots « membre » et « member »…
21 septembre 2010 à 4:39
Bonjour, je renvois un commentaire car mon problème est en fait un peu différent de ce que je pensais.
J’ai deux problèmes que je n’arrive pas à régler.
1) lorsque j’arrive sur les pages de login, j’ai systématiquement le message « Identifiant ou mot de passe incorrects. » qui ne s’en va que si je rafraichis la page.
2) lorsque je me loggue, rien ne se passe, et je dois rafraichir la page « admin » ou « membres » pour acceder finalement à la page d’accueil.
Merci beaucoup de votre aide!
22 septembre 2010 à 8:10
@Méphistophélès: une seule table users avec des groupes, cela revient à mettre en place les ACL, or comme dit en introduction, l’idée ici est d’avoir une gestion simple de 2 groupes seulement SANS les ACL.
Pour ce qui est du mélange anglais français, j’ai choisi d’utiliser le préfixe « membres » en français pour l’affichage dans l’URL (« connectez-vous sur monsite.fr/membres ») mais on peut rester intégralement en anglais et customiser les URL dans le Router.
@Aaron: pose ta question sur le forum ou sur l’IRC, ce sera plus efficace.
22 septembre 2010 à 10:34
Merci pour votre réponse, et désolé pour mes remarques assez sèches…
Et merci pour cet article utile, et pour ce site qui est très utile.
Néanmoins, votre article et votre code gagneraient en clarté si vous amélioriez votre terminologie:
les nom des tables sont étranges, et reflètent mal qu’elles sont liées à la gestion de deux espaces, « l’espace membres » et « l’espace admin ».
De plus le fait d’avoir une entrée « admin » dans la table « users » vient en doublon avec le code, où est géré l’espace admin…
Le fait d’utiliser le terme « membres » pour désigner l’ »espace membres », et « member » pour désigner sa gestion est aussi source de maux de têtes…
24 septembre 2010 à 5:52
Merci pour l’info. J’ai encore un ou deux détails à régler.
Lorsque je fais la modification indiquée par Zmbl pour
@Deedo: Pour moi non plus ne reconnait pas la variable $session, as tu réglé ce problème?
4 octobre 2010 à 0:11
bonjour,
merci pour ce tuto, ça fonctionne à la perfection au niveau de la gestion des 2 espaces distincts
le seul problème que je rencontre, c’est que l’espace membre (client, dans mon cas), le mot de passe n’est pas hashé lorsque j’ajoute/modifie un membre/client
j’ai lu dans les commentaires plus haut que tu utilisais
pour forcer le hashage du mot de passeje viens de passer des heures à multiplier les tests, mettre le hash dans un beforeSave, directement dans le controller, etc… exemples tentés dans le beforeSave de mon modèle :
function beforeSave() { // essai 1 : marche pas //$password = Security::hash($this->data['Client']['password'], null, true); //$this->set($this->data['Client']['password'], $password); // essai 2 : marche pas //$this->data['Client']['password'] = Security::hash($this->data['Client']['password'],null,true); //return true; }où as-tu placé le hash pour que ça fonctionne ?
merci
11 octobre 2010 à 11:02
Bonjour,
merci pour ce tuto, le plus accessible sur le sujet sans doute. J’ai un soucis à priori au niveau du hashage de mot de passe. A la création SQL à l’aide de SHA1([clé]pass) le hash généré ne correspond pas à celui que j’envoie via le formulaire, j’ai pris la clef dans core.php (Modifié à l’installation) mais ça ne fonctionne pas. Si quelqu’un a une petite idée la dessus…
Ensuite je voudrais avoir plus de précisions sur les actions protégées si possible. La démarche pour protéger la fonction add de Articles par exemple c’est: - modif dans le controller Article de ‘add’ en ‘adminadd’ - création d’une vue dans /views/articles/adminadd ??
Si je ne modifie que le controlleur je tombe sur un ArticlesController::admin_add() cannot be accessed directly
J’espère que quelqu’un pourra apporter des précisions la dessus, @+
13 octobre 2010 à 23:58
Salut Fish,
moi aussi j’ai eu le même problème avec le hashage SHA 1. Le seule solution que j’ai trouvé a été de passer en hashage md5. Tu dois juste penser à faire la modif quand tu entres le mot de passe dans la base et au niveau de la config de cake.
27 octobre 2010 à 16:53
Bonjour, La connexion pour le préfixe par défaut (Admin) se fait correctement cependant, pour Membre il va chercher les comptes de Admin Pourriez vous m’aiguiller quand a mon erreur ? Merci, Cordialement
28 octobre 2010 à 8:27
Aaron, comment tu fais pour passer en md5 ? d’avance merci
30 octobre 2010 à 17:27
Merci pour ce tuto pour moi tout a fonctionné du premier coup par contre j’ai du modifier les routes sinon il y avait des problèmes avec les liens dans l’administration:
Router::connect( ‘/admin’, array(‘controller’ => ‘users’, ‘action’ => ‘home’, ‘admin’ => ‘true’) );
Merci encore et bonne continuation.
31 octobre 2010 à 11:53
Bonjour,
Excelent tuto, Est t il possible d’intégrer ce composant avec une connexion en Ajax ?
22 novembre 2010 à 21:38
J’ai eu le même problème que Fish, il faut hacher le mot de passe comme ça avant d’enregistrer:
30 novembre 2010 à 16:00
Bonjour, Pour des raisons de sécurité j’aimerai utiliser un système de « sleep » ou de « captcha » si quelqu’un essaye de ce connecté plus de trois fois successive sans succès. Quelqu’un pourrait-il m’orienter en sachant que j’utilise Cake 1.2 avec le composant Auth.
Merci pour vos réponses.
15 décembre 2010 à 17:09
Tout marche à merveille sauf un petit hic qui gène quand-meme: Le champs password n’est pas hashé automatiquement par le composant authentification. Bien que on peut le hasher manuellement mais vous me serai d’un grand secours si vous m’expliquer la cause. Merci.
22 décembre 2010 à 21:06
Bonsoir
J’aimerai avoir quelques détails sur un problème que je rencontre lors de la déconnexion lorsque je suis logué avec un utilisateur. Parfois tout marche bien et certaines fois j’ai ce message d’erreur:
<?php class UtilisateursController extends AppController {
} ?>
Je n’arrive pas à bien voir dans quel cas il se déclenche.
Quelqu’un a déjà eu ce pb ?
Merci et bonne soirée
30 décembre 2010 à 11:06
Bonjour merci pour ce tuto je suis débutant avec cakePHP 1.3.6
j’ai essayé ce tuto, mais j’ai un problème: lorsque j’accède à http://127.0.0.1/cake/admin il m’affiche « Accès Admin Vous n’avez pas accès à cette page. »
et quand j’entre login + passe, il m’affiche que l’identifiant ou mot de passe incorrects.
A votre avis, comment résoudre ce problème? Merci
10 février 2011 à 12:57
Bonjour,
Tout d’abord merci pour cet article.
Est-il possible de proposer une authentification sur deux modèles différent, un pour un prefix spécifique, et un autre pour les routes sans prefix?
Merci D’avance
12 février 2011 à 10:31
Bonjour,
Merci pour votre article, je me met peu à peu à cake et j’avous que ce dernier m’est très utile.
Néanmoins je rencontres un petit problème, en effet quand j’appel le préfixe admin/ il me demande l’action login du controlleur AdminsControlleur (j’ai un peu modifié votre exemple) mais quand je lui indique users/ comme préfixe il me demande de créer le controlleur LoginController.
Avez vous une idée du problème ?
PS: j’avais déjà crée mon système d’inscription dans le controlleur users avec l’action register (j’avais donc un modèle et une déclaration beforeFilter() dans appController associée)
8 mars 2011 à 12:56
Bonjour,
d’abord, merci pour les tutos, et en particulier celui-ci…
Juste un truc, enfin deux;-)
Dans le AppController, il faut remettre le component ‘Session’:
class AppController extends Controller { var $components =array(‘AppAuth’,'Session’) }
sinon, c’est la misère… Cake 1.3 ne l’inclut pas d’office apparemment.
le second:
Pourquoi utiliser ‘admin’ comme préfixe?
C’est un peu ambigu par rapport au ‘admin’ déjà utilisé par cake à la base. C’est juste pour avoir une cohérence dans les URL?
Bonne journée
13 mars 2011 à 11:18
Bonjour, ce tuto à l’ai interesant et j’en est vraiment besoin seulement je débute dans php et je ne suis pas sur de comprendre je dois forcement placer
à la ligne 102 ? ou n’importe ou dans le fichier core ?
4 avril 2011 à 16:00
Bonjour,
C’est un super article.
Néanmoins, j’ai une question. Comment faire appel à une action d’un controller sans être obligatoirement logué ?
Merci d’avance.
6 mai 2011 à 17:06
Pour gauthier :
Bonjour,
je ne sais pas si c’est la meilleure méthode, mais tu peux redéfinir la méthode beforeFilter au niveau de ton contrôleur, et ajouter
$this->Auth->AllowedAction(‘ton_action’);
(je ne suis plus certain de la syntaxe…)
bien cordialement.
20 juin 2011 à 21:41
Merci pour ton tuto qui est sympa
Par contre j’ai un warning quand je me loguer sur membres ou users :
Warning (2): array_merge() [function.array-merge]: Argument #2 is not an array [CORE\cake\libs\controller\components\auth.php, line 887]
Et avec les correction que l’on voit dans les commentaires, tu pourrais le mettre à jour dans le poste principal ?
18 août 2011 à 12:02
Pour répondre à la question de Fish qui est celle ci :
» Bonjour,
Ensuite je voudrais avoir plus de précisions sur les actions protégées si possible. La démarche pour protéger la fonction add de Articles par exemple c’est: – modif dans le controller Article de ‘add’ en ‘adminadd’ – création d’une vue dans /views/articles/adminadd ??
Si je ne modifie que le controlleur je tombe sur un ArticlesController::admin_add() cannot be accessed directly
J’espère que quelqu’un pourra apporter des précisions la dessus, @+ «
Voila comment on accède au méthode du style « admin_MAFONCTION ». Avec cette URL : http://localhost/TonSite/admin/users/MAFONCTION/
Ou si tu veux afficher le lien via un helpers, c’est comme ceci :
echo $this->Html->link(‘Modif le User 3′, array(‘admin’ => true, ‘controller’ => ‘TonControllerOuEstLAFonction’, ‘action’ => ‘MAFONCTION’));
Voila, chez moi ça marche
21 août 2011 à 11:46
Pourquoi CakePHP ne crypte plus aucun password automatiquement ? N’y a-t-il pas moyen de le paramétrer pour qu’il le fasse ?
Car à cause de ca, on ne peux plus utiliser $validate pour valider le password via le Model… =/ Puisqu’on fait manuellement le cryptage avant le save…
Imaginons, on veux que la taille mini du password soit 7 caractères. Si on rentre un password vide, on crypte avant le save. Donc il passe la validation car « vide » fait quand même 40 caractères une fois crypté.
Enfin voila,
La seul soluce que j’ai trouvé c’est insérer en base. Sans crypté pour que le validate se fasse normalement. Puis un saveField avec le cryptage.
Je trouve ca dommage quand même, vous avez mieux comme solution ?
14 octobre 2011 à 12:28
Mythix,
J’ai eu le même problème et j’ai trouvé finalement une bonne solution : faire la validation sur le champs de confirmation de mot de passe, qui lui n’est pas crypté automatiquement. Si par exemple il a moins de 7 caractères, j’affiche le message d’erreur aux 2 champs (mot de passe et confirmation du mot de passe).