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ère AuthComponent, 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éthode startup() à 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.

Pierre-Emmanuel Fringant

Articles connexes

Commentaires

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 :)

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

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.

$this->AppAuth->hashPasswords($this->data['Candidat']['password']);

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 :

function login()
{
    if($this->Session->check('Auth.Member.id'))
    {
        $this->redirect($this->referer(array('controller' => 'members', 'action' => 'edit', 'membres' => true)), true);
    }
}
Je vais essayer de voir d’où vient le problème… 2) Pour hasher le password je fais :
Security::hash($password, null, true);

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 :)

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 :

function login()
{
    if($this->Session->check('Auth.Member.id'))
    {
        if($this->Session->check('Auth.redirect'))
        {
            $this->redirect($this->Session->read('Auth.redirect'));
        }
 
        $redir = $this->referer();
 
        if($redir == $this->here)
        {
            $redir = $this->AppAuth->loginRedirect;
        }
 
        $this->redirect($redir);
    }
}

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.

Bonjour, je souhaitais savoir à quoi correspondait le 3eme paramètre de ce code (app_auth.php) :

'loginRedirect'  =&gt; array('controller' =&gt; 'members', 'action' =&gt; 'home', 'membres' =&gt; true),

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 ?

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… ?!

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 »

Pas du tout, il ne faut créer une route que si l’on souhaite changer le comportement par défaut.

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 ? ;)

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

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

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’));

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 ?

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

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

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

Euuuu je crois avoir trouvé, est-ce que ce tuto marche pour la version 1.2 de CakePHP ? -_-’

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

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

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.

@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/

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

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.

if(!empty($this->params['prefix']))

Cordialement.

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

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 :

var $defaults = array(
 ...
 'userScope' => array(null),
 ...
 );

au lieu de

var $defaults = array(
 ...
 'userScope' => null,
 ...
 );

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.

Merci pour l’info

Merci beaucoup pour l’histoire du « UserScope » !

 'userScope' =&gt; array(null),

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 ;)

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

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

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

Vraiment très bon tuto! Juste 2 problèmes pour moi, 1 -

function login()
{
    if($this-&gt;Session-&gt;check('Auth.Member.id'))
    {
        if($this-&gt;Session-&gt;check('Auth.redirect'))
        {
            $this-&gt;redirect($this-&gt;Session-&gt;read('Auth.redirect'));
        }</p>
 
<pre><code>    $redir = $this-&gt;referer();
 
    if($redir == $this-&gt;here)
    {
        $redir = $this-&gt;AppAuth-&gt;loginRedirect;
    }
 
    $this-&gt;redirect($redir);
}
</code>

} 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éé).

if(!empty($this-&gt;data)) {
            if($this-&gt;Member-&gt;save($this-&gt;data)) {
                $this-&gt;AppAuth-&gt;login($this-&gt;data);
$this-&gt;redirect(...);
}
Et il ne me connecte pas, je n'y comprend rien. Peut être qu'il manque un truc pour lui dire que c'est le modèle Member que j'utilise?

En tout cas très bon tuto même s'il me reste 2 zones d'ombres.

J’ai réslou le 2e problème pour ceux que cela intéresserai: il faut appeler la fonction _setup avant la fonction login.

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 ! :)

Il faut bien mettre echo $this->Session->flash(‘auth’); dans la vue de login.

Merci beaucoup ! J’avais oublié le echo (erreur d’etourderie :/)

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.

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 !

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!

Personne ne sais faire ca? :(

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 »…

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!

@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.

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…

Merci pour l’info. J’ai encore un ou deux détails à régler.

Lorsque je fais la modification indiquée par Zmbl pour

'userScope' =&gt; array(null),
, en effet ce la règle le fait que tout le monde accédait à tous les services, néanmoins pour moi impossible de se connecter. Il semble que les mots de passe ne correspondent pas à ceux de la base de données. Est-ce un problème de hashage?

@Deedo: Pour moi non plus ne reconnait pas la variable $session, as tu réglé ce problème?

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

Security::hash($password, null, true);
pour forcer le hashage du mot de passe

je 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

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, @+

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.

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

Aaron, comment tu fais pour passer en md5 ? d’avance merci

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.

Bonjour,

Excelent tuto, Est t il possible d’intégrer ce composant avec une connexion en Ajax ?

J’ai eu le même problème que Fish, il faut hacher le mot de passe comme ça avant d’enregistrer:

$this-&gt;data['Member']['password'] = Security::hash($this-&gt;data['Member']['password'], 'sha1', true);

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.

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.

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 {

var $name = 'Utilisateurs';


function util_logout() {

}

} ?>

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 :)

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

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

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)

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

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

Configure::write('Routing.prefixes',array('admin', 'membres'));

à la ligne 102 ? ou n’importe ou dans le fichier core ?

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.

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.

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 ?

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 ;)

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 ?

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).

Participez

Pour insérer une portion de code, utilisez <pre lang="php">...</pre>