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