IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Acl & Zend_Auth PHP Discussion :

Authentification et champ vide dans les formulaires


Sujet :

Zend_Acl & Zend_Auth PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    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 :
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 606
    Par défaut
    En effet c'est très bizarre, tu a essayé de débugger avec xDebug ? T'es sous eclipse ?

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 178
    Par défaut
    Hello,

    En voyant ta condition de traitement du formulaire de news
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    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 ?

    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.

  5. #5
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 606
    Par défaut
    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

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    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 ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Masquer un champ vide dans un formulaire access
    Par anassyto dans le forum IHM
    Réponses: 2
    Dernier message: 25/06/2013, 16h24
  2. champ vide dans une formulaire
    Par nadia68 dans le forum IHM
    Réponses: 18
    Dernier message: 28/04/2008, 08h51
  3. Champ vide dans un formulaire
    Par moilou2 dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/02/2008, 12h19
  4. champ vide dans un formulaire
    Par nadia68 dans le forum IHM
    Réponses: 9
    Dernier message: 12/06/2007, 00h56
  5. Total de champs vide dans un formulaire
    Par gretch dans le forum Langage
    Réponses: 2
    Dernier message: 09/05/2006, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo