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 :
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.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
L'action add du controller :
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
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 } } }
Extrait de mon Acl :
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); }
Mon plugin Auth :
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
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
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); }
Merci
Partager