Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Acl & Zend_Auth
Zend_Acl & Zend_Auth Forum d'entraide pour les composants Zend_Acl & Zend_Auth du Zend Framework (contrôle d'accès, gestion des droits, authentification, etc.). Avant de poster -> Cours Zend_Acl et Zend_Auth.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2010, 12h58   #1
Invité de passage
 
Inscription : août 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 10
Points : 3
Points : 3
Par défaut Authentification et champ vide dans les formulaires

Bonjour,

J'utilise un système d'authentification basé sur le tutoriel de Rob Allen. Il marche très bien, y a pas de soucis.
J'ai fait un formulaire de news très classique avec id, titre, date, contenu. Tout marche bien (ajout, modification, suppression de news) à un détail près : quand l'un des champs est vide lors de l'ajout d'une news, j'obtiens une erreur :
Citation:
Fatal error: Uncaught exception 'Zend_Auth_Adapter_Exception' with message 'A value for the identity was not provided prior to authentication with Zend_Auth_Adapter_DbTable
Je suis un peu perdu car j'ai du mal à voir ce que vient faire une erreur d'authentification dans mon formulaire... Je suis logué en admin donc j'ai tous les droits et je n'ai aucun problème d'authentification quand je remplit correctement le formulaire.

L'action add du controller :
Code :
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
 
    public function addAction() // Add : Ajoute une news
    {	
		$this->view->title = "Ajouter une news";
		$this->view->headTitle($this->view->title, 'APPEND');
 
		$form = new Form_News(); // Création de l'objet formulaire de news
		$form->reset->setLabel('Effacer'); // Modifie le nom du boutton reset	
		$form->envoyer->setLabel('Ajouter'); 
 
		$this->view->form = $form; // Passage du formulaire en paramètre de la vue
 
		if ($this->getRequest()->isPost()) // Si la requete recupérée ($this->getRequest) est de type POST (cas du formulaire)
		{
			$formData = $this->getRequest()->getPost(); // On récupère le formulaire
 
			if ($form->isValid($formData)) // isValid vérifie tous les vérificateurs définis dans le formulaire et renvoie TRUE s'ils sont tous vérifiés
			{
				$title = $form->getValue('title'); // Récupération de la valeur du formulaire
 
				$date = new Zend_Date(); // On définit la date actuelle
				$date = $date->toString("YMdHms"); // On la convertie dans le format timestamp de la BDD
 
				$newsContent = $form->getValue('newsContent');			
 
				$news = new Model_DbTable_News(); // Création de l'objet Db_Table 
				$news->addNews($title, $date, $newsContent); // Ajout d'une news
 
				$this->_redirect('/admin/newslist'); // Redirection de l'utilisateur
			}
			else 
			{		
				$form->populate($formData); // Remplissage du formulaire avec les informations qui ont été passées
			}
		}
    }
La fonction concernée du modèle :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
public function addNews($title, $date, $newsContent) // Ajouter une news
	{
		$data = array(
			'title' => $title,
			'date' => $date,
			'newsContent' => $newsContent,
		);
 
		$this->insert($data);
	}
Extrait de mon Acl :
Code :
1
2
3
4
 
		$this->add(new Zend_Acl_Resource('index'));
		$this->addRole(new Zend_Acl_Role('Administrateur')); // Admin
		$this->allow('Administrateur'); // Les admins peuvent accéder à toutes les ressources
Mon plugin Auth :
Code :
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 
	private $_auth;
	private $_acl;
 
	private $_noauth = array( // Module/Controlleur/Action qui sera appellé si l'utilisateur n'est pas logué (ici, la page de login)
 
		'module' => 'default',
		'controller' => 'Auth',
		'action' => 'login');
 
	private $_noacl = array( // Module/Controlleur/Action qui sera appellé si l'utilisateur n'a pas les droits nécessaires pour accéder à la ressource (ici, erreur de privilèges)
 
		'module' => 'default',
		'controller' => 'Auth',
		'action' => 'login'); // A MODIF
 
	public function __construct($auth, $acl)
	{
		$this->_auth = $auth;
		$this->_acl = $acl;			
	}
 
 
	public function preDispatch($request) // Fonction appellée avant le controlleur (cf schéma du parcours d'une requête dans le framework)
	{	
		if ($this->_auth->hasIdentity()) // Si l'utilisateur est identifié
		{
			$role = $this->_auth->getIdentity()->role; // On récupère son rôle (guest, member, admin). Ici on lit directement la valeur de la colonne 'role' de la BDD et on n'utilise pas getUser()->role
 
		}
 
		else // Si l'utilisateur n'est pas connecté, c'est un visiteur
		{
			$role = 'Visiteur';
		}
 
		// Récupération des informations concernant la page que l'utilisateur souhaite afficher
 
		$module = $request->module;
		$controller = $request->controller;
		$action = $request->action;		
		$resource = $controller;
 
		if (!$this->_acl->has($resource)) // Si la ressource n'est pas déclaré dans le fichier de configuration Mercure_Acl
		{
 
			$resource = null; // On met la ressource à null (cf fonctionnement de la classe Acl)
 
		}
 
		if (!$this->_acl->isAllowed($role, $resource, $action)) // Si l'utilisateur n'a pas le droit d'accéder à la ressource
		{
 
			if (!$this->_auth->hasIdentity()) // Cas ou il n'est pas connecté, on va le reRouter vers la page définie précedement pour cela (ie un formulaire de login)
			{
 
				$module = $this->_noauth['module'];
				$controller = $this->_noauth['controller'];
				$action = $this->_noauth['action'];
			}
 
			else // Cas ou l'utilisateur est connecté mais n'a pas les droits suffisants, on le reRoute vers la page d'erreur de privilèges
			{
 
				$module = $this->_noacl['module'];
				$controller = $this->_noacl['controller'];
				$action = $this->_noacl['action'];
			}
		}
 
		// On modifie la requête pour que le reRoutage puisse avoir lieu
		$request->setModuleName($module);
		$request->setControllerName($controller);
		$request->setActionName($action);			
	}
J'ai un peu de mal à faire le lien entre le formulaire et l'erreur d'authentification donc si quelqu'un à une piste, je suis preneur

Merci
HaloKard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 14h34   #2
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : octobre 2006
Messages : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
En effet c'est très bizarre, tu a essayé de débugger avec xDebug ? T'es sous eclipse ?
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 09h43   #3
Membre confirmé
 
Patrick Barroca
Inscription : mai 2008
Messages : 178
Détails du profil
Informations personnelles :
Nom : Patrick Barroca

Informations forums :
Inscription : mai 2008
Messages : 178
Points : 204
Points : 204
Hello,

En voyant ta condition de traitement du formulaire de news
Code :
if ($this->getRequest()->isPost()) {
qui dit en gros que cela s'enclenche dès qu'on post n'importe quel formulaire, je me dit que si tu fais ça pour tous tes forms tu vas avoir plein de comportements rigolos

Il faut absolument que chaque action devant traiter un formulaire soit capable de détecter qu'il s'agit bien d'un post de son formulaire et pas d'un autre.

Personnellement, pour ça j'ajoute un champ hidden nommé id qui suit une convention de nommage pour que ce soit unique dans d'application.
patbator est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 13h06   #4
Invité de passage
 
Inscription : août 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 10
Points : 3
Points : 3
Les nouvelles du front : le problème touche maintenant l'ensemble des formulaires même quand ils sont bien complétés...

Je n'utilisais pas d'IDE. Comme c'est pas la première fois que je trouve Zend difficile à debugguer, j'ai sauté le pas et installé Eclipse et Xdebug.
Ma configuration a l'air de marché mais je ne suis pas beaucoup avancé car je ne sais pas quel partie du code debuggué. Comment dire a eclipse que je veux debugguer telle partie de mon code ?

Citation:
qui dit en gros que cela s'enclenche dès qu'on post n'importe quel formulaire, je me dit que si tu fais ça pour tous tes forms tu vas avoir plein de comportements rigolos
Oui, je vais remédier à ça.
HaloKard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 14h50   #5
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : octobre 2006
Messages : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
Citation:
Envoyé par HaloKard Voir le message
Les nouvelles du front : le problème touche maintenant l'ensemble des formulaires même quand ils sont bien complétés...

Je n'utilisais pas d'IDE. Comme c'est pas la première fois que je trouve Zend difficile à déboguer, j'ai sauté le pas et installé Eclipse et Xdebug.
Ma configuration a l'air de marché mais je ne suis pas beaucoup avancé car je ne sais pas quel partie du code déboguée. Comment dire a eclipse que je veux déboguer telle partie de mon code ?



Oui, je vais remédier à ça.
Tu dois lui mettre un point d'arrêt en double cliquant dans la marge sur la ligne voulue, ensuite tu pourra voir les valeurs de tes variables la ou tu as mis ton point d'arrêt
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 22h45   #6
Invité de passage
 
Inscription : août 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 10
Points : 3
Points : 3
J'ai vérifié toutes les variables suceptibles de jouer un rôle lors de l'envoi du formulaire, tout est ok.

Le problème vient bien d'un échec d'authentification lors de l'envoi du formulaire. Mais je comprend même pas pourquoi mon appli tente de d'authentifier l'user...

Des pistes vers lesquels il faut que je me tourne ?
HaloKard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 15h39   #7
Invité de passage
 
Inscription : août 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 10
Points : 3
Points : 3
J'ai compris ce qui se passe ! J'ai mis du temps sachant que patbator avait donné la solution...

Dans mon plugin Auth, j'ai un if ($this->_request->isPost()) tout comme dans mon controller de news. Celui du plugin est appelé avant de celui des news.

Du coup, mon plugin auth recupère la valeur identity du formulaire de news (y en a pas) donc l'authentification peut pas se faire.

Je vais mettre des id sur tout mes formulaires, ca devrait mieux fonctionner.
HaloKard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h59.


 
 
 
 
Partenaires

Hébergement Web