Interface d’administration d’un site CakePHP avec le Composant Auth
Nous souhaitons fournir à notre client un panneau d’administration pour qu’il puisse éditer lui-même le contenu de son site, par exemple un simple blog avec des Articles. Nous nous imposons plusieurs contraintes :
- L’administration doit être accessible à l’adresse
/admin; - Toutes les actions de cet espace d’administration doivent avoir une url commençant par
/admin; - L’administration doit avoir un layout différent de celui du site public ;
- L’accès à l’administration requiert l’authentification d’un administrateur autorisé par un couple login / mot de passe. Nous nous limiterons ici à un seul type (ou rôle) d’utilisateur.
1. Mise en place de l’administration
1.1. Prise en compte des url commençant par /admin
Nous allons indiquer à CakePHP que nous souhaitons préfixer toutes les URL des actions de l’administration par /admin. Cela se fait très simplement en décommentant la ligne 65 du fichier {app}/config/core.php :
64 65 | // {app}/config/core.php Configure::write('Routing.admin', 'admin'); |
A présent, si nous appelons l’adresse /admin/articles/add dans notre navigateur, cela renvoie sur l’action adminadd que nous définirons dans le Contrôleur ArticlesController.
1.2. Page d’accueil de l’administration
La page d’accueil de notre administration affiche simplement un lien vers la création d’un nouvel article, suivi de la liste des 10 articles les plus récemment publiés. Nous allons donc créer l’actionadminindex dans le Contrôleur des Articles :
1 2 3 4 5 6 | // {app}/controllers/articles_controller.php function admin_index() { $articlesRecents = $this->Article->findAll(null, null, 'created DESC', 10); $this->set('articlesRecents', $articlesRecents); } |
Nous créons la vue correspondante :
1 2 3 4 5 6 7 8 9 10 11 12 13 | // {app}/views/articles/admin_index.ctp
<h2>Les derniers articles</h2>
<a href="/admin/articles/add">Créer un article</a><br/>
<?php
foreach($articlesRecents as $article)
{
e($html->link(
$article['Article']['titre'],
'/admin/articles/edit/'.$article['Article']['id'])
);
e('<br/>');
}
?> |
Nous pouvons d’ores et déjà nous rendre à l’adresse /admin/articles/index. Nous remarquons deux problèmes : d’une part nous voulons accéder à l’administration via l’URL /admin et non pas /admin/articles/index, et d’autre part la vue que nous venons de créer s’affiche avec le même layout que le site public, alors qu’il est préférable de fournir une mise en page plus légère et plus fonctionnelle pour les actions d’administration.
1.3. Une route pour le point d’entrée dans l’administration
Nous allons créer une nouvelle route pour relier l’adresse/admin à la page d’accueil de notre administration, soit /admin/articles/index.
1 2 3 4 5 6 7 8 9 | // {app}/config/routes.php Router::connect( '/admin', array( 'controller' => 'articles', 'action' => 'index', 'prefix' => 'admin' ) ); |
Notez le paramètre ‘prefix’.
1.4. Un layout réservé à l’administration
Nous allons maintenant faire en sorte que toutes les pages de l’administration aient un layout différent de celui du site public. Le meilleur endroit pour décider de cela : la méthodebeforeRender du Contrôleur général de l’application :
// {app}/app_controller.php function beforeRender() { if(isset($this->params['prefix']) && $this->params['prefix'] == 'admin') { $this->layout = 'admin_default'; } }
Et nous créons un layout réservé à l’administration à cet emplacement : {app}/views/layouts/admin_default.ctp.
// {app}/views/layouts/admin_default.ctp
<?php e($html->docType('html4-strict')); ?>
<html>
<head>
<?php e($html->charset('iso-8859-1')); ?>
</head>
<body>
<h1>Administration</h1>
<div id="main">
<?php
// Message d'erreur éventuel envoyé par Auth
$session->flash('auth');
// Autre message éventuel
$session->flash();
// Contenu
e($content_for_layout);
?>
</div>
</body>
</html>Cette fois, si nous nous rendons à l’adresse /admin, nous arrivons bien sur la page d’accueil de l’administration, et cette page dispose d’un layout différent que celui du site public. Nous pouvons mettre en place l’authentification des utilisateurs autorisés avec le Composant Auth.
2. L’authentification
2.1. Gestion des comptes utilisateur
Nous commençons par créer la table qui va contenir les comptes utilisateur autorisés à accéder à l’administration. Nous allons en créer un par défaut, sinon nous ne pourrons jamais nous connecter à l’administration.CREATE TABLE `users` ( `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT, `login` VARCHAR(16) NOT NULL, `password` CHAR(40) NOT NULL, `disabled` tinyint(1) UNSIGNED NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM;
Les champs de la table sont les suivants :
id: clé primaire ;login: identifiant de l’administrateur, pouvant comporter jusqu’à 16 caractères ;password: résultat du passage de la clé de sécurité suivie du mot de passe de l’administrateur par une méthode de hachage (SHA1 par défaut, qui produit toujours une chaine de 40 caractères) ;disabled: indique si l’utilisateur est bloqué (1) ou non (0) ;created: date de création du compte. Géré par CakePHP.
INSERT INTO `users` (`id`, `login`, `password`, `disabled`, `created`) VALUES (1, 'admin', SHA1('6a10cdde80fb56150efda09365f91579ea74a944admin'), 0, NOW());
Nous insérons un administrateur dont le login est admin et le mot de passe admin. Remarquez l’utilisation de la fonction SHA1 disponible directement dans MySQL, à laquelle nous passons une chaine de caractère composée de la clé de sécurité (que l’on peut trouver dans le fichier {app}/config/core.php aux alentours de la ligne 150) et du mot de passe de l’administrateur. Tout ce processus sera ensuite entièrement géré par CakePHP, mais il nous faut bien un premier compte pour se connecter à l’administration.
Maintenant que la table users est créée, nous avons besoin du Modèle User et du Contrôleur UsersController :
1 2 3 4 5 | // {app}/models/user.php class User extends AppModel { var $name = 'User'; } |
1 2 3 4 5 | // {app}/controllers/users_controller.php class UsersController extends AppController { var $name = 'Users'; } |
2.2. Initialisation du Composant Auth
CakePHP fournit un Composant dédié au processus d’authentification utilisateur : Auth. Ce Composant se charge d’autoriser ou de refuser l’accès à certaines actions en fonction de critères que nous allons lui indiquer, et de rediriger un utilisateur non autorisé sur un formulaire de connexion. Auth se charge également de gérer la fonction de connexion et de déconnexion à l’administration.
Dans la mesure où l’administration concerne des actions dans chaque Contrôleur de notre application, nous allons gérer les autorisations dans le Contrôleur général. Comme la restriction d’accès doit se faire avant tout autre traitement, nous plaçons notre logique dans la méthode beforeFilter.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | // {app}/app_controller.php class AppController extends Controller { var $helpers = array ('Html', 'Text', 'Form'); var $components = array('Auth'); function beforeFilter() { if(isset($this->Auth)) { $this->Auth->userModel = 'User'; $this->Auth->fields = array('username' => 'login', 'password' => 'password'); $this->Auth->userScope = array('User.disabled' => 0); $this->Auth->loginAction = '/users/login'; $this->Auth->loginRedirect = '/admin/articles'; $this->Auth->loginError = "Identifiant ou mot de passe incorrects."; $this->Auth->logoutRedirect = '/'; $this->Auth->authError = "Vous n'avez pas accès à cette page."; $this->Auth->autoRedirect = true; $this->Auth->authorize = 'controller'; if((empty($this->params['prefix']) || $this->params['prefix'] != 'admin') && $this->action != 'login') { $this->Auth->allow(); } } } function isAuthorized() { return true; } function beforeRender() { if(isset($this->params['prefix']) && $this->params['prefix'] == 'admin') { $this->layout = 'admin_default'; } } } |
Nous avons ici volontairement défini toutes les variables possibles du Composant Auth. Quelques explications :
$this->Auth->userModel = 'User';Nom du Modèle qui gère les comptes utilisateur.$this->Auth->fields = array('username' => 'login', 'password' => 'password');Nous indiquons au Composant les champs du Modèle qui doivent être vérifiés lors d’une identifiation, ici login et password.$this->Auth->userScope = array('User.disabled' => 0);Nous pouvons ici définir une condition supplémentaire pour valider une identification : dans notre cas nous ne validons pas un utilisateur dont le compte est bloqué.$this->Auth->loginAction = '/users/login';ou$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');Nom du contrôleur et de l’action qui va afficher le formulaire de connexion.$this->Auth->loginRedirect = '/admin/articles/index';ou$this->Auth->loginRedirect = array('controller' => 'articles', 'action' => 'index', 'prefix' => 'admin');Si l’utilisateur a essayé d’atteindre une page nécessitant une authentification, il est aussitôt redirigé vers le login mais l’adresse de la page refusée est gardée dans la session. Si l’utilisateur se connecte, il est renvoyé vers l’adresse connue dans la session, sinon il est renvoyé sur la page définie ici.$this->Auth->loginError = "Identifiant ou mot de passe incorrects.";Message d’erreur affiché si le couple login / mot de passe saisi dans le formulaire de connexion n’est pas connu.$this->Auth->logoutRedirect = '/';Page de destination en cas de déconnexion volontaire, dans notre cas la page d’accueil du site public.$this->Auth->authError = "Vous n'avez pas accès à cette page.";Message d’erreur affiché en cas de tentative d’accès à une page qui nécessite une authentification.$this->Auth->autoRedirect = true;Définit si Auth doit automatiquement rediriger sur $this->Auth->loginRedirect ou non en cas d’identification correcte. Cela peut être utile de mettre cette variable à false si nous avons un traitement à effectuer juste après la connexion (gestion d’un cookie ou autre). Ce traitement devra se faire dans l’action login du Contrôleur UsersController.$this->Auth->authorize = 'controller';Lorsque cette variable vaut ‘controller’, Auth va chercher une méthodeisAuthorizeddans le AppController et/ou dans le Contrôleur en cours. Cette méthode pourra accueillir des traitements supplémentaire pour déterminer si l’utilisateur enregistré en session a bien le droit d’aller plus loin. Elle doit renvoyer true ou false.
1 2 3 4 | if((empty($this->params['prefix']) || $this->params['prefix'] != 'admin') && $this->action != 'login') { $this->Auth->allow(); } |
Si la variable $this->params['prefix'] n’existe pas ou qu’elle ne vaut pas ‘admin’, et que l’action demandée n’est pas le login, alors on autorise l’accès.
2.3. Les actions login et logout
Dans le Contrôleur UsersController :// {app}/controllers/users_controller.php function login() { $this->layout = 'admin_default'; }
Nous définissons uniquement le layout, tout le traitement sera pris en charge par le Composant (vérification du couple login / mot de passe).
La vue correspondante :
1 2 3 4 5 6 7 8 | // {app}/views/users/login.ctp $this->pageTitle = "Identification requise"; // Formulaire de connexion e($form->create('User', array('action' => 'login'))); e($form->input('login', array('label' => 'Identifiant :'))); e($form->input('password', array('label' => 'Mot de passe :'))); e($form->end("Connexion")); |
Voyons l’action de déconnexion :
1 2 3 4 5 6 | // {app}/controllers/users_controller.php function logout() { $this->Session->setFlash("Vous êtes maintenant déconnecté."); $this->redirect($this->Auth->logout()); } |
Commentaires
21 février 2008 à 16:19
Encore un article pertinent et clair ! Juste ce dont j’avais besoin ce jour… quelle coïncidence !
Bon, juste quelques questions quand même, parce que mes test n’ont pas été concluants :
1) le modèle utilisé doit-il forcément s’appeler « User » ?
2) peut-on avoir les « loginAction » et « loginRedirect » dans des contrôleurs différents ?
3) ton accueil principal de l’admin est en fait lié à un contrôleur métier « Articles », mais j’ai besoin de faire un accueil Admin général, indépendant de toute action d’un contrôleur métier. Dans cet accueil général je souhaiterai avoir le formulaire de login si l’utilisateur n’est pas connecté, puis le menu de mon interface d’admin (avec cette fois des liens vers des actions admin de mes contrôleurs métiers) quand l’authentification est validée. est-ce possible ?
21 février 2008 à 18:01
1) le modèle utilisé doit-il forcément s’appeler “User” ? Pas du tout. Il suffit de définir dans le
AppControllerquel modèle doit être utilisé :$this->Auth->userModel = ‘Exemple’; $this->Auth->fields = array(‘username’ => ‘champ1’, ‘password’ => ‘champ2’);2) peut-on avoir les “loginAction” et “loginRedirect” dans des contrôleurs différents ? Je n’ai pas testé mais je pense que oui, il suffit là aussi de l’indiquer à Auth dans leAppController. 3) ton accueil principal de l’admin est en fait lié à un contrôleur métier “Articles”, mais j’ai besoin de faire un accueil Admin général, indépendant de toute action d’un contrôleur métier. Aucun problème, il suffit de créer un Contrôleur pour le menu (MenusControllerpar exemple) qui contient une seule action videadminindex, et une vue dansviews/menus/adminindex.ctpqui affiche le menu de l’admin. Il ne reste ensuite qu’à changer la route/adminpour qu’elle pointe sur/admin/menu/index, et changer la ligne :$this->Auth->loginRedirect = ‘/admin/users/menu’;en :$this->Auth->loginRedirect = ‘/admin/menus/index’;dans leAppController.21 février 2008 à 19:01
Merci pour tes réponses. J’avais bien analysé les choses et elles ne me surprennent pas… Cependant, cela ne fonctionne pas chez moi.
Le plus bizarre, c’est que je suis redirigé vers ma page de login, même quand je saisis une url sans le préfix « admin » ?!
Voilà ce que j’ai mis dans Routes.php :
Router::connect(‘/admin’, array(‘controller’ => ‘admins’, ‘action’ => ‘index’, ‘prefix’ => ‘admin’));
Oui, je sais, le nom de mon contrôleur général d’admin n’est pas très joli (admins), mais bon cela ne devrait pas gêner pour les url « non-admin ».
Tant que je ne suis pas loggué, toute page demandée (même sans le préfix admin) m’envoie automatiquement sur la page de login !? Ainsi, si je lance mon site à la racine : « http://www.monsite.com/ », je suis redirigé automatiquement sur « http://www.monsite.com/admins/login »
Est-ce que cela peut venir de : « $this->Auth->authorize = ‘controller’; » ?
28 février 2008 à 10:12
Tu as entièrement raison.
En réalité la fonction isAuthorized n’est appelée que si l’utilisateur est déjà autorisé. Elle sert à ajouter des traitements pour savoir si on autorise ou pas l’utilisateur enregistré à continuer. Il faut donc placer la logique de déclenchement du composant Auth directement dans le beforeFilter. L’article a été mis à jour. Merci pour ta perspicacité !
28 février 2008 à 10:22
Il n’y a pas de quoi ;o) Je suis un peu opiniâtre quand je ne comprends pas quelque chose…
J’avais commencé à réfléchir à $this->Auth->allow() ou $this->Auth->deny() en regardant à nouveau en détail le Cookbook au sujet du Composant Auth et je me disais bien que cette méthode isAuthorized ne servait à rien en l’état…
Merci en retour de ta confiance et de ta réactivité pour mettre à jour le tutoriel.
Je passe aux Acos/Aros maintenant…
Pour ceux qui veulent faire plus « PHP 5″ et éviter de surcharger de lignes de code la méthode beforeFilter() de AppController (on aura peut-être besoin d’y ajouter d’autres logiques…), j’ai créé une méthode privée « setAuthStuff() » qui contient la logique du Component Auth et qui est donc simplement appelée par beforeFilter().
Je garde à l’esprit que je pourrais ensuite affiner mes droits d’accès via la méthode isAuthorized(), que je déclarerai dans le(s) contrôleur(s) concerné(s).
Enfin, je n’utilise pas $this->params['prefix'] dans les tests, mais $this->params['admin'] qui peut-être false ou true… mais bon, là je chipote !
28 février 2008 à 11:16
« je n’utilise pas $this->params[’prefix’] dans les tests, mais $this->params[’admin’] qui peut-être false ou true »
28 février 2008 à 11:47
Ah bon ? Pourtant, tous mes var_dump dans beforeFilter semblaient me renvoyer un « admin = true » lorsque j’étais dans une page d’admin… mais effectivement, j’ai quelques soucis pour que mon process d’authentification fonctionne parfaitement, peut-être est-ce du à celà ?
28 février 2008 à 11:55
Ok, je viens de vérifier et effectivement, le « $params[admin] = true » n’existe que si l’url contient ‘admin’… mais alors quelle différence y a-t-il entre « prefix = ‘admin’ » et « admin = true » ?
28 février 2008 à 12:05
Ca marche ! Enfin, j’ai le comportement adéquat et mon authentification fonctionne parfaitement. Je suis donc revenu à $this->params['prefix'] pour tester le layout et le Auth->allow() !
A l’occasion, si tu comprends l’intérêt du $params['admin']…
7 avril 2008 à 17:21
Je reviens sur ce processus d’Authentification, car j’ai un souci lorsque je crée de nouveaux utilisateurs dans mon back-office : je souhaite valider le mot de passe saisi (vide, minLength…) et afficher un message d’erreur approprié, or il semble que le Component Auth ajoute automatiquement le « security salt » dans l’input qui correspond au mot de passe. Du coup, si une autre règle de validation ne passe pas, au réaffichage de mmon formulaire je vois apparaître la string de hashage dans le champ !? As-tu une astuce pour valider les mots de passe et afficher des messages d’erreur adéquat sans réafficher le mot de passe, ni le hash ?
7 avril 2008 à 18:28
Dans le formulaire de création d’un utilisateur, utilise un autre nom de champ pour le mot de passe que celui de ta table. Si la validation passe, tu l’ajoutes à la main à $this->data sous le vrai nom du champ mot de passe, et tu sauves.
8 avril 2008 à 8:31
Merci, cela fonctionne pour l’affichage du message d’erreur et cela ne réaffiche pas le hash dans le champ. Mais la sauvegarde est mauvaise : il ne me crée pas le SHA1 du mot de passe saisi, mais me met une série de « »… Peut-être que je m’y prends mal ? Voilà ce que j’ai mis dans mon Modèle :
8 avril 2008 à 9:20
$this->Administrateur->data[’passe’] = $this->Auth->password($this->Administrateur->data[’mot_passe’]);8 avril 2008 à 9:29
Désolé, cela ne fonctionne pas…
« Fatal error: Call to a member function password() on a non-object »
En fait c’est normal, dans mon modèle, il ne connait pas le component Auth !
8 avril 2008 à 10:08
Je suis allé trop vite :
$this->Administrateur->data[’passe’] = $this->Administrateur->Auth->password($this->Administrateur->data[’mot_passe’]);8 avril 2008 à 10:15
Désolé, c’est toujours pas bon !
« Undefined property: Administrateur::$Administrateur «
et
« Trying to get property of non-object »
Mais tout cela me semble logique : on ne peut pas accéder à un component depuis le modèle, en tout cas pas de manière aussi simple…
8 avril 2008 à 10:36
Arf, je n’avais pas lu que tu faisais cela dans le beforeSave… Fais plutôt tout ça dans le contrôleur. Si tu tiens vraiment à le faire dans le beforeSave du modèle, il faut que tu hash le password à la main :
$this->data['passe'] = sha1(Configure::read('Security.salt').$this->data['mot_passe']);8 avril 2008 à 10:41
Ben oui j’avais bien précisé être dans beforeSave() ;o))
Je ne souhaite pas faire trop de cuisine de validation dans le contrôleur, j’estime que ce n’est pas le meilleur endroit pour le faire (sinon, pourquoi mettre le tableau $validate dans le modèle ?).
Bon, même avec ta solution sha1, cela ne fonctionne pas ! Je n’ai plus de message d’erreur PHP, mais le passe sauvegardé est encore une suite de « » !?
8 avril 2008 à 10:54
Mes antislashs ne passent pas… donc je disais que la chaîne sauvegardé était une suite de \ \ \ (antislash0 antislash0 antislash0)
9 avril 2008 à 10:17
Bon, j’ai réussi en faisant dans mon contrôleur :
[code] $errors = $this->validateErrors($this->Administrateur); if ($errors === false) { $this->data['Administrateur']['passe'] = $this->Auth->password($this->data['Administrateur']['mot_passe']); } $this->Administrateur->create(); if ($this->Administrateur->save($this->data)) [/code]
La description dans l’Api de Controller::validateErrors() n’est pas claire et je ne pensais pas qu’on pouvait faire cette vérif avant $this->Model->save()
30 avril 2008 à 17:12
PB DE DECONNEXION !
Superbe tutoriel. D’autant plus utile que l’information est si difficile à trouver à travers tous ces blogs de bakers.
Je me suis construit une mini appli en suivant pas à pas ton article. Tout fonctionne à merveille sauf la déconnexion. Impossible de réobtenir la page d’accueil par défaut.
Dans le beforeFilter, j’ai bien spécifié : $this->Auth->logoutRedirect = ‘/’;
et ma fonction logout est la même que la tienne.
Mais j’obtiens une page blanche avec le message de déconnection (de la fonction logout), mais avec un plantage de la redirection :
Vous êtes maintenant déconnecté.
Warning (2): Cannot modify header information – …
Une expérience à ce sujet de ton côté ?
30 avril 2008 à 18:59
Ce genre d’erreur vient souvent d’un espace qui traîne avant ou après un < ?php ... ?>
Est-ce que tu obtiens aussi cette erreur quand tu vas à la racine ‘/’ directement, sans passer par la déconnexion ?
1 mai 2008 à 9:22
BINGO ! J’ai trouvé.
Tout d’abord, pas d’erreur en retournant directement à la racine.
Et j’ai tourné en rond pendant 1 heure ce matin, avant de réaliser. C’était dû à un stupide problème d’internationalisation.
En effet, j’ai pris l’habitude d’utiliser au maximum le script bake pour produire mon code. Je laisse les textes tels quels dans les fichiers produits et je traduis tout dans /locale/fre/LC_MESSAGES/default.po. C’est très pratique.
Donc, dans la fonction logout, j’ai écrit :
$this->Session->setFlash(__('Logged out.'));que j’ai traduit dans le fichier .po
Mal m’en a pris, c’est ça qui a m’a planté. Auth ne sait apparemment pas gérer ça, et renvoie la traduction AVANT le layout, et non pas DANS le layout, à l’endroit du
<?php $session->flash('auth'); ?>Morale de l’histoire : Toujours reproduire fidèlement un tuto, au caractère près. Une fois que ça marche, on peut s’amuser à modifier. Bien fait pour moi !23 mai 2008 à 10:16
Bonjour,
Grand merci pour toutes ces explications !
Après une bonne soirée de boulot, j’ai finalement un système d’authentification presque parfait.
Petite question, toutefois. L’affichage du formulaire d’identification fonctionne sur les pages protégées, j’ai bien accès à ma page une fois identifié, mais l’authentification ne semble pas être stockée en session (ou ailleurs) : dès que je clique sur un lien du backoffice, j’obtiens à nouveau le formulaire d’authentification.
Est-ce un point qu’il faut gérer manuellement ?
Sinon quelqu’un aurait une idée d’où pourrait venir le problème ?
Merci, et bonne continuation Jérémie
23 mai 2008 à 10:44
Le problème est finalement résolu.
La ligne en cause était dans le fichier config/core.php : Configure::write(‘Security.level’, ‘high’);
qui définit un timeout très court pour les sessions.
C’est bon à savoir
Bonne journée
28 mai 2008 à 12:01
Bonjour,
je suis débutante dans cakephp, j’ai bien suivi ton tutoriel mais je me bloque dans le Composant Auth. je l’ai télécharger depuis le lien : http://api.cakephp.org/auth_8php-source.html
Mais ça me donne une erreur sur la page
Fatal error: Class ‘App’ not found in C:\xampp\htdocs\scala\cake\libs\controller\components\auth.php on line 31
pouvez vous m’aider ?
28 mai 2008 à 13:16
Le composant Auth est déjà présent dans la librairie de CakePHP, nul besoin de le télécharger en plus.
Pour travailler avec CakePHP il faut commencer par télécharger l’ensemble de la librairie sur le site officiel.
29 mai 2008 à 11:41
Merci Pierre,
Ben justement j’ai pas trouvé le fichier auth.php dans la librairie du CakePHP c’est pour j’ai le l’ai télécharger et j’ai toujours l’erreur
29 mai 2008 à 12:56
Le Component Auth se trouve dans Cake/cake/libs/controllers/components/auth.php.
Si tu ne trouves pas ce fichier c’est que la version de Cake que tu as téléchargée n’est pas bonne.
31 mai 2008 à 22:35
Bonjour, j’essaye de réaliser votre tutoriel mais je bloque au niveau du 1.3
lorsque j’accede a l’url /admin/posts/index , cela marche correctement, mais des que je vais sur l’adresse /admin j’ai une erreur :
Missing controller You are seeing this error because controller Controller could not be found. Notice: If you want to customize this error message, create app\views/errors/missing_controller.thtml. Fatal: Create the class below in file : app\controllers\controller.php
Pourtant je pense avoir bien configuré ma route : Router::connect(‘/admin’, array(‘controller’ => ‘posts’, ‘action’ => ‘index’, ‘prefix’ => ‘admin’));
Quelqu’un pourrait-il m’éclairer car je n’ai trouvé aucune réponse sur le net
merci bien
1 juin 2008 à 21:00
Merci pour cet article! Ça éclaircis beaucoup la question des Auth dans Cake.
Bonjour du Québec
2 juin 2008 à 7:26
Marine, est-ce que vous utilisez bien la version 1.2 de CakePHP ?
2 juin 2008 à 16:10
Oups en effet, j’utilisais la version 1.1xx …Désolée Et merci pour l’article, ça marche drôlement mieux avec la 1.2
5 juin 2008 à 9:52
Bonjour, j’essaye de personnaliser les messages renvoyés par le composant Auth (suite au tutoriel « Personnalisation des messages “flash” »). Mais je n’y arrive pas. J’ai essayé des trucs du genre : $this->Auth->loginError = $this->Session->setFlash(‘Blabla.’, ‘message_erreur’,array(),’Auth’); Mais impossible. Donc est-ce que c’est possible et comment ça fonctionne ?
Merci (et au passage merci aussi pour le site, il m’aide énormément !)
5 juin 2008 à 10:41
Il n’est pas possible de passer en paramètre le layout que l’on souhaite, mais c’est un message qui ne va finalement s’afficher que sur la page de login, vous pouvez donc aisément le personnaliser dans la Vue du login :
if($session->check('Message.auth')) { e('<div class="erreur">'); $session->flash('auth'); e('</div>'); }5 juin 2008 à 11:02
Nickel, merci !
25 juin 2008 à 12:57
Bonjour, très bon tuto mais je reste bloqué a un endroit. Tout est correct mais quand je veux tester le login/mdp, rien ne se passe. Je n’ai même pas de message pour me dire que ca n’est pas valide. Ca réactualise la page et c’est tout.
25 juin 2008 à 14:20
Commencez par réglez le debug à 2 dans config/core.php et regardez si la requête SQL est correcte.
25 juin 2008 à 14:29
tout d’abord, merci de votre intérêt. Ensuite, le débug est dèja à 2, car en développement. Donc je n’ai que cette requête: 1 DESCRIBE
users26 juin 2008 à 13:00
c’est bon ça marche mais pour être franc je ne sais pas comment, j’ai fait un mélange avec ce tuto : http://www.studiocanaria.com/articles/cakephpauthcomponentusersgroupspermissionsrevisited et en suivant mes instincts de programmeurs, je suis arrivé a le faire fonctionné mais je n’ai pas réellement compris comment. Cependant, je rencontre des problèmes sur la partie multi-lingue du site. Je finirais pas trouver et merci pour vos tutos
27 juin 2008 à 16:28
ok, it work perfectly for me, thanks very much.
I just had a small issue when adding the admin password in Mysql, because of two missing ‘. I has to put SHA1(‘hashkeyxxxxxadmin’).
cheers
19 septembre 2008 à 12:27
Petite remarque (qui m’a fait perdre de précieuses minutes !) : on ne PEUT PAS utiliser AuthComponent dans un controller appelé « tests_controller » ! Il y a en effet un test en dur dans le composant qui fait qu’il ne checke pas les droits si le nom du controller = ‘app’ ou ‘tests’ …
Pas de bol, je fais tous mes tests dans mon tests_controller. Journéedemerde tiens.
8 octobre 2008 à 10:54
Bonjour,
j’essaye de mettre en place ce système en suivant votre tuto. je rencontre cependant un petit pb. j’ai activé le debug 2, et quand je regarde la requête il me cherche le mot de passe crypté en md5 alors qu’il est bien inséré en sha ds la bdd via auth. je n’ai indiqué nul part de passer en md5. j’avoue ne pas trop comprendre et ne pas trouver pourquoi. Auriez vous une idée ? info? astuce?
par avance merci et bravo pour ce site.
8 octobre 2008 à 11:08
oups, je viens de trouver, il y avait une erreur à l’enregistrement du mot de passe. hash sur hash ca marche moins bien :p
29 octobre 2008 à 8:34
Bonjour, J’essaye actuellement de mettre en place un système d’administration en suivant ce tuto. Cependant, au moment de tester le controller, il m’indique que la méthode admin_index est manquante, alors qu’elle est bel et bien présente !
Ce problème est-il du au fait que j’utilise la version 1.2 de cake ? J’ai déjà corrigé le $this->Article->findAll en $this->Article->find(‘all’)
Merci d’avance si l’un de vous peut m’éclairer sur ce problème !
9 novembre 2008 à 20:01
merci … simple mais sincère alors.
FG
PS: …pour tout !
13 novembre 2008 à 23:16
Question con normal débutant en cake PHP:
Tout dabord merci pour ce tutoriel très instructif juste pour information car je bloque à ce niveau la :
1.4. Un layout réservé à l’administration Nous allons maintenant faire en sorte que toutes les pages de l’administration aient un layout différent de celui du site public. Le meilleur endroit pour décider de cela : la méthode beforeRender du Contrôleur général de l’application :
// {app}/appcontroller.php function beforeRender() { if(isset($this->params['prefix']) && $this->params['prefix'] == ‘admin’) { $this->layout = ‘admindefault’; } }
Je ne trouve pas le app_controller.php est ce normal ? Ou faut il le créer car ce n’est pas mentionné dans le tuto.
Merci d’avance de vos réponses
14 novembre 2008 à 8:37
S’il n’est pas présent à la racine du dossier {app}, il faut le créer :
14 novembre 2008 à 8:38
Désolé pour le message d’avant en cherchant un peu j’ai trouvé il était dans un autre dossier
.
Autre problème je n’arrive pas à me logger avec admin admin
pourtant bien entré la bonne requete sql le insert du tutoriel …
Quelqu’un peut il savoir d’ou cela provient ?
14 novembre 2008 à 8:40
Il ne faut pas rentrer la même requête que celle du tuto, car la clé de sécurité est unique ! Tu peux la retrouver dans {app}/config/core.php vers la ligne 150.
21 décembre 2008 à 22:11
Bonjour,
le fichier app_controller.php est-il nécessaire? Car si je le crée à la racine du fichier, le layout ne subit aucune modification lorsque je vais dans /admin. Le layout subit les modifications si je place la fonction beforeRender dans mon controller Article.
22 décembre 2008 à 9:18
Tous les Contrôleurs de l’application héritent de la classe AppController, le fait d’avoir un fichier app_controller.php à la racine du dossier {app} (pas dans le répertoire des autres controleurs) permet de factoriser certaines opérations communes à tous les contrôleurs, comme ici la gestion du layout.
22 décembre 2008 à 11:41
29 janvier 2009 à 13:14
Bonjour a tous,
petit problème, quand je vais a l’url /admin il me redirige bien vers /user/login
mais il me dit » UsersController could not be found. «
que faire?? merci d’avance pour vos réponse
29 janvier 2009 à 13:28
Ce doit être $this->Auth->loginAction qui n’est pas bon, il doit manquer un ‘s’.
29 janvier 2009 à 14:09
non j’ai vérifier il a bien le ‘s’
$this->Auth->loginAction = ‘/users/login’;
29 janvier 2009 à 15:42
ok c’est bon j’ai trouvé mon erreur g tout simplement oublie d’ouvrire dans un fichier
3 février 2009 à 20:56
Bonsoir,
J’ai suivi le tuto, mais j’ai un souci sur la requete : dans le debug j’ai : SELECT
Users.id,Users.login,Users.password,Users.disabled,Users.createdFROMusersASUsersWHEREUsers.id= (Array) ANDUsers.disabled= 0 LIMIT 1Je ne vois pas où id = (Array) provient ?
Merci pour votre aide.
3 février 2009 à 21:23
Désolé, tout est OK… j’avais oublié mis un
6 février 2009 à 14:17
Est il possible d’utiliser deux prefix de cette façon : Configure::write(‘Routing.admin’, ‘admin’); Configure::write(‘Routing.manager’, ‘manager’);
Je m’explique mon site est jeu de gestion et je souhaite avoir deux systèmes d’authentification.Un premier pour les administrateurs du site qui serait du type http://monsite/admin/controller/action. Et un second pour les utilisateurs du jeu qui accéderaient a leur menu via http://monsite/manager/controller/action.
Ensuite est il possible de configurer deux authentification différentes sachant que l’un porterait sur les admin et l’autre sur les utilisateurs
Je vous remercie d’avance
7 février 2009 à 13:08
Bonjour,
Est-il normal que la fonction de déconnexion s’appelle « logout » ? Je pense que « admin_logout » serait plus logique.
Plus généralement, les actions accessibles dans l’espace administration ne devraient-elles pas toutes s’appeler « admin_qqchose » ?
Merci.
27 avril 2009 à 11:57
Bonjour,
J’ai suivi votre tuto et j’ai pris en compte toutes les remarques en commentaire. Mais, lorsque je me log en admin admin il se se passe rien il me reaffiche la page de connexion Pourtant elle se redirige automatiquement non ?
Merci d’avance
27 avril 2009 à 15:14
en plus il me dit que le mot de passe est invalide alors que j’ai pris la cle de securité de mon cake dans le core
Vous pouvez m’aider svp
MErci d’avance
1 juillet 2009 à 12:17
Est-on obligé de passer par le prefixe admin ?
En fait j’ai une liste d’action reservé à l’admin et une liste d’action publiques. Comment gérere celà sans layout admin ni préfixe admin.
Exemple :
Controlleur Commentaires : Publique : Voir Ajouter
Privée Editer Supprimer
Controlleur Billets : Publique : Voir
Privée Ajouter Editer Supprimer
1 juillet 2009 à 13:45
Tu n’es pas obligé du tout de te servir d’un préfixe pour différencier les actions d’admin des actions publiques, il suffit de le spécifier pour chaque action en utilisant les méthodes $this->Auth->allow() et $this->Auth->deny(). C’est juste plus rapide avec la méthode décrite dans le tutorial, puisqu’on définit un comportement général pour toutes les actions qui commencent par ‘admin_’, sans avoir besoin de le dire dans chaque contrôleur.
7 juillet 2009 à 13:27
Bonjour et merci pour ce très bon tuto!!
Voilà, j’aurais aimé savoir si il était possible de faire que le composant auth n’enregistre pas automatiquement la page refusée(voir 2.2), pour que l’utilisateur qui se connecte soit redirigé vers une page prédéfinie par le développeur. Si oui, comment puis-je faire?
Cordialement,
7 juillet 2009 à 14:06
Ca doit être faisable. Je commencerais par mettre $this->Auth->autoRedirect = false, puis faire la redirection de mon choix dans l’action login :
7 juillet 2009 à 14:34
Nickel, ça marche du tonnerre. Merci beaucoup de votre aide.
Bonne continuation.
11 août 2009 à 14:42
Bonjour,
le tuto est nicvkel, mais j’ai un gros soucis sous ie8 et autres m….
je me log sans soucis, navigue trankilou…. mais dès que je fais une sauvegarde ou une édition, ie me répond que la page est expirée… le soucis vient d’un soucis d’écriture de données chiffrées selon ie;-)
j’ai eu beau changer le mode de session (de ‘php’ à ‘database’), rien n’y fait…
une idée salvatrice serait grandement la bienvenue;-)
merci d’avance et bonne journée
13 août 2009 à 5:33
Bonjour tout le monde je viens de découvrir cakephp et je suis très satisfait de ces fonctionnalité
en ce moment je suis entrain de realiser une petite application dans laquelle j’ai trois table users , auteurs , livres tout ce passe bien si la personne manipulatrice de l’application n’est pas méchante le probleme c’est que lorsque un auteur aimerais modifier/afficher un livre il a le droit méme si ce livre n’est pas à lui via la barre d’adresse http://localhost/projet/livres/edit/17 par exemple si il change le nombre 17 par 19 qui est l’identifiant d’un livre appartenant à un autre auteur il pourra le manipuler comme il veut Nb : n’importe quel auteur ne pourra manipuler ces données qu’après l’authentification
21 août 2009 à 9:00
Bonjour,
Je me suis servi de votre tutorial comme base pour mon application, et elle m’a été d’une grande aide.
Je me posais tout de même une question. Avant l’authentification de mon utilisateur, je dois vérifier qu’il appartient au bon domaine (en fait, un utilisateur se connecte sur un domaine en particulier). Ce domaine est renseigner par un code, je dois donc aller chercher en base le domaine, et ensuite regarder si l’utilisateur appartient au domaine.
Quel endroit vous semble le plus propice pour gérer ce genre d’action ? Comme la vérification se situe dans le beforefilter, je pense que la vérification ne devrait pas trouver sa place dans le login.
Merci
1 septembre 2009 à 21:48
Hello,
j’ai une petite question par rapport à ce super tutorial !
Lorsqu’on défini un « Route » admin sur « Articles/index » comme dans le tutorial, lorsqu’on créé un lien avec :
$html->link(« Articles », array(« controller »=> »articles », « action »=> »index »);
le lien est automatiquement /admin. La seule option que j’ai trouvée est d’indiquer « admin »=>false en argument. C’est pas très propre vu que à la base /articles/index n’a rien avoir avec /articles/admin_index…
Que faire pour palier à ce problème sans devoir rajouter un peu aléatoirement « admin »=>false en argument de $html->link() ?
Merci !
14 septembre 2009 à 10:43
même problème que Fred !
4 octobre 2009 à 19:25
Tout d’abord félicitations pour ce super tutoriel, très utile pour ne pas dire indispensable!
J’ai un petit souci, j’ai suivi toutes les étapes mais visiblement quelque chose cloche car lorsque je vais sur /admin, j’obtiens bien ma vue admin comme une liste d’articles ici mais le layout reste le même que sur ma page d’accueil avec le menu or que j’ai bien créé un layout admin_default.ctp et lorsque je vais sur /admin, je ne suis pas redirigé vers la demande de login.
Avez-vous une idée de ce qui cloche?
Merci!!
12 octobre 2009 à 17:08
Bonjour, J’ai fait tout comme y faut. Tout marche bien sur le site en local. Mais je viens de mettre en ligne. Et là ..paf!!! Misère Quoique je fasse je suis redirigé vers le panneau de login. Quelqu’un aurait il une idée ? (la bonne si possible)
6 novembre 2009 à 18:33
Bonjour et merci pour ce tuto très utile mais apres verification, une fois l’utilisateur déloggué, si je rentre l’url « monsite.com/admin/posts » j’arrive a acceder a la partie admin sans probleme et sans demande de login/password !
Cela vient il des routes ? Ou d’une érreur dans le/les contrôleur(s) ?
6 novembre 2009 à 19:05
Il s’agit simplement du fait que la page est encore dans le cache du navigateur. Tu dois pouvoir effectivement revenir sur la dernière page visitée quand tu étais logué, mais si tu cliques sur n’importe quel lien ou que tu essaies de valider un formulaire, Cake te renverras sur le login.
6 novembre 2009 à 19:15
Merci de répondre aussi vite !
Et bien en fait j’ai vider mon cache et j’ai tester avec un autre explorateur au cas ou je t’explique par étapes ce que j’ai fait :
monsite.com/admin/posts (j’ai remplacé ici articles par posts ce qui je pense ne devrait pas poser de problème)
A cet adresse j’ai la liste des article et mon lien pour me délogguer! , je me déloggue et ensuite j’arrive à la page principale « / ».
si dans l’url je rajoute /admin/posts je retombe sur l’affichage des article sans avoir eu besoin de me logguer…
Donc je pense que c’est plus qu’un simple problème de cache qu’en pense tu ?
6 novembre 2009 à 19:35
Ok je vient de tester en remplacant
$this->Auth->allow();
par :
$this->Auth->deny();
En espérant que ca soit réellement sécure !
2 décembre 2009 à 17:23
Bonsoir,
j’utilise Auth & cakephp et cela fonctionne tres bien à l’exception d’une chose. je me connecte en tant qu’admin et la je peux gérer mes users inscrits au site. j’édit un user, je ne veux pas changer son pass donc je laisse le champ vide (ainsi que celui de confirmation). mais Auth me crypte qd meme bien que la value du champ soit vide et du coup m’update le mot de passe dans la bdd. une solution pour ca ? merci !
9 janvier 2010 à 17:53
vince, si tu as trouvé une solution je suis preneur !