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 01/12/2010, 14h35   #1
Membre régulier
 
Homme Vincent Leboulanger
Développeur informatique
Inscription : janvier 2005
Messages : 315
Détails du profil
Informations personnelles :
Nom : Homme Vincent Leboulanger
Localisation : France

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

Informations forums :
Inscription : janvier 2005
Messages : 315
Points : 80
Points : 80
Par défaut [ZF 1.11.0] Problème de privilège

Bonjour,
voilà je rencontre un problème avec mon site, sur mon ordinateur (il fonctionne chez l'hébergeur)
J'arrive à me connecter à mon site via login/pwd, puis j'ai accès au menu qui me liste mes données.
Je peux ouvrir un formulaire qui me permet de créer un élément dans ma base de données, mais dès que je valide ce formulaire, je suis renvoyé sur la view '/error/privileges'
J'obtiens la même erreur si je lance un export de la base de donnée.
Je ne comprends pas d'où ça vient, le contenu de la BDD est identique entre mon ordinateur et le serveur.
Auriez-vous une solution ? ou début de piste ?
Merci
vince29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 09h31   #2
Membre régulier
 
Homme Vincent Leboulanger
Développeur informatique
Inscription : janvier 2005
Messages : 315
Détails du profil
Informations personnelles :
Nom : Homme Vincent Leboulanger
Localisation : France

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

Informations forums :
Inscription : janvier 2005
Messages : 315
Points : 80
Points : 80
Bonjour,
Je vois que mon problème ne trouve pas beaucoup d'idées ... dommage car cela devient urgent pour moi.
Je connais mal Zend framework, mais je cherche partour une solution. J'ai l'impression que mon problème de privilèges provient de ZENN_ACL.

Si cela peut vous aider, voici le code utiliser :

index.php
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
<?php
 
/*
 
 */
// Constantes principales...
define("HOME_OS_DIR","C:/AppServ");
define("WEBAPP_DIR",HOME_OS_DIR."/www/zfProject");
define("MODEL_DIR",WEBAPP_DIR."/application/models");
define("ROOT_URL","http://zfproject.localhost/zfProject");
define("BASE_URL","/");
define("ZEND_FRAMEWORK_DIR",HOME_OS_DIR."/dev/ZendFramework-1.9.2/library");
define("LOG_FILE",HOME_OS_DIR."/logs/zend.log");
 
define("PLUGINS_DIR",WEBAPP_DIR."/application/plugins");
define("VALID_DIR",WEBAPP_DIR."/application/MyValid");
define("CGI_DIR",WEBAPP_DIR."/cgi");
 
 
set_include_path(
  ".".PATH_SEPARATOR.
  MODEL_DIR.PATH_SEPARATOR.
  ZEND_FRAMEWORK_DIR.PATH_SEPARATOR.PLUGINS_DIR.PATH_SEPARATOR.
  VALID_DIR.PATH_SEPARATOR.
  get_include_path()
);
 
 
/*Pour pouvoir loader des classes Ó la Zend*/
require_once 'Zend/Loader.php';
 
 
// ... Comme par exemple le registre
Zend_Loader::loadClass("Zend_Registry");
 
// Initialisation de la log
Zend_Loader::loadClass('Zend_Log');
Zend_Loader::loadClass('Zend_Log_Writer_Stream');
$logger = new Zend_Log();
$logger->addWriter(new Zend_Log_Writer_Stream(LOG_FILE));
Zend_Registry::set("logger",$logger);
Zend_Registry::get("logger")->debug("** IP ". $_SERVER["REMOTE_ADDR"] . "** URI=".$_SERVER["REQUEST_URI"]);
 
 
// Controller init
Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass('Zend_Controller_Router_Rewrite');
$controller = Zend_Controller_Front::getInstance();
 
 
$router = new Zend_Controller_Router_Rewrite();
 
$cmtRoute = new Zend_Controller_Router_Route(
    "comment/:action/:comment",
    array(  "comment"=>null,
            "controller"=>"comment",
            "action"=>"display"
    )
);
$router->addRoute("comment",$cmtRoute);
$controller->setBaseUrl(BASE_URL);
 
$controller->setRouter($router);
 
//Ici on indique le rÚpertoire des controlleurs
$controller->setControllerDirectory('application/controllers');
$controller->throwExceptions(true);
 
// initialisation du viewRenderer
Zend_Loader::loadClass("Zend_View");
$view = new Zend_View();
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setView($view)
             ->setViewSuffix('phtml');
 
// chargement de la configuration
Zend_Loader::loadClass('Zend_Config_Ini');
$config = new Zend_Config_Ini('application/configs/application.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);
 
// Mise en place de la db
Zend_Loader::loadClass("Zend_Db");
Zend_Loader::loadClass("Zend_Db_Table");
$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);
Zend_Registry::set('dbAdapter', $db);
 
//Chargement de la classe d'authentification
Zend_Loader::loadClass('Zend_Auth');
$auth = Zend_Auth::getInstance();
 
// CrÚation de l'objet Acl
 
Zend_Loader::loadClass('Zend_Acl');
Zend_Loader::loadClass('Zend_Acl_Role');
Zend_Loader::loadClass('Zend_Acl_Resource');
Zend_Loader::loadClass('PluginAuth');
Zend_Loader::loadClass('MyAcl');
$acl = new MyAcl($auth);
$controller->registerPlugin(new PluginAuth($auth, $acl));
 
//Ajout VLB
/*$acl = new Zend_Acl();
 
$acl->addRole(new Zend_Acl_Role('invite'))
    ->addRole(new Zend_Acl_Role('membre'))
    ->addRole(new Zend_Acl_Role('admin'));
 
$parents = array('invite', 'membre', 'admin');
$acl->addRole(new Zend_Acl_Role('someUser'), $parents);
 
$acl->add(new Zend_Acl_Resource('error'));
$acl->add(new Zend_Acl_Resource('index'));
$acl->add(new Zend_Acl_Resource('com'));
$acl->add(new Zend_Acl_Resource('dp'));
$acl->add(new Zend_Acl_Resource('pay'));
$acl->add(new Zend_Acl_Resource('retourpaybox'));
$acl->add(new Zend_Acl_Resource('user'));
$acl->add(new Zend_Acl_Resource('auth'));
$acl->add(new Zend_Acl_Resource('xport'));
$acl->add(new Zend_Acl_Resource('msg'));
 
$acl->allow('admin');
                       */
 
 
/**
 * TODO Gestion des profils
 */
 
/**
 * Configuration par d+faut de Zend_Mail
 */
require_once 'Zend/Mail.php';
require_once 'Zend/Mail/Transport/Smtp.php';
 
 
$cfg = array('port' => $config->email->port,
    'auth' => $config->email->auth,
    'username' => $config->email->username,
    'password' => $config->email->password,
    'ssl'           => $config->email->ssl
  );
define("MAIL_FROM",$config->email->mailfrom);
 
$transport = new Zend_Mail_Transport_Smtp($config->email->smtp, $cfg);
Zend_Mail::setDefaultTransport($transport);
 
 
 
/*
 * Configuration par dÚfaut du translator de Zend_Form pour avoir les messages d'erreur en Franþais
 */
Zend_Loader::loadClass('Zend_Form');
Zend_Loader::loadClass('Zend_Translate');
 
 
        $french = array(
	        'notAlnum' => "'%value%' ne contient pas que des lettres et/ou des chiffres.",
	        'notAlpha' => "'%value%' ne contient pas que des lettres.",
	        'notBetween' => "'%value%' n'est pas compris entre %min% et %max% inclus.",
	        'notBetweenStrict' => "'%value%' n'est pas compris entre %min% et %max% exclus.",
	        'dateNotYYYY-MM-DD'=> "'%value%' n'est pas une date au format AAAA-MM-JJ (exemple : 2000-12-31).",
	        'dateInvalid' => "'%value%' n'est pas une date valide.",
	        'dateFalseFormat' => "'%value%' n'est pas une date valide au format JJ/MM/AAAA (exemple : 31/12/2000).",
	        'notDigits' => "'%value%' ne contient pas que des chiffres.",
	        'emailAddressInvalid' => "'%value%' n'est pas une adresse mail valide selon le format adresse@domaine.",
	        'emailAddressInvalidHostname' => "'%hostname%' n'est pas un domaine valide pour l'adresse mail '%value%'.",
	        'emailAddressInvalidMxRecord' => "'%hostname%' n'accepte pas l'adresse mail '%value%'.",
	        'emailAddressDotAtom' => "'%localPart%' ne respecte pas le format dot-atom.",
	        'emailAddressQuotedString' => "'%localPart%' ne respecte pas le format quoted-string.",
	        'emailAddressInvalidLocalPart' => "'%localPart%' n'est pas une adresse individuelle valide.",
	        'notFloat' => "'%value%' n'est pas un nombre décimal.",
	        'notGreaterThan' => "'%value%' n'est pas strictement supérieur à '%min%'.",
	        'notInt'=> "'%value%' n'est pas un nombre entier.",
	        'notLessThan' => "'%value%' n'est pas strictement inférieur à '%max%'.",
	        'isEmpty' => "Ce champ est vide : vous devez le compléter.",
	        'stringEmpty' => "Ce champ est vide : vous devez le compléter.",
	        'regexNotMatch' => "'%value%' ne respecte pas le format '%pattern%'.",
	        'stringLengthTooShort' => "'%value%' fait moins de %min% caractères.",
	        'stringLengthTooLong' => "'%value%' fait plus de %max% caractères.",
	        'ibanNotSupported' => "'%value%' est un IBAN provenant d'un pays inconnu",
	        'ibanFalseFormat' => "'%value%' ne correspond pas au format en vigueur pour le pays concerné",
	        'ibanCheckFailed' => "'%value%' ne passe pas le test de la somme de contrôle. Veuillez vérifier votre saisie",
	        'fileFilesSizeTooBig' => "La taille de fichier maximale autorisée est de '%max%', cependant '%size%' ont été détectés",
	        'fileFilesSizeTooSmall' =>"La taille de fichier minimale autorisée est de '%min%', cependant '%size%' ont été détectés",
	        'fileFilesSizeNotReadable' => "Impossible de lire le fichier"
        );
 
        $translate = new Zend_Translate('array', $french, 'fr');
        Zend_Form::setDefaultTranslator($translate);
 
 
Zend_Loader::loadClass('Zend_Paginator');
Zend_Loader::loadClass('Zend_View_Helper_PaginationControl');
Zend_Paginator::setDefaultScrollingStyle('Sliding');
Zend_View_Helper_PaginationControl::setDefaultViewPartial('my_pagination_control.phtml');
 
		//Zend_Auth::getInstance()->clearIdentity();
// call dispatcher
$controller->dispatch();
?>
la classe MyAcl :

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
<?php
class MyAcl extends Zend_Acl
{
    public function __construct(Zend_Auth $auth)
    {
 
 
        $this->add(new Zend_Acl_Resource('error'));        
        $this->add(new Zend_Acl_Resource('index'));        
        $this->add(new Zend_Acl_Resource('com'));
        $this->add(new Zend_Acl_Resource('dp'));
        $this->add(new Zend_Acl_Resource('pay'));        
        $this->add(new Zend_Acl_Resource('retour'));
        $this->add(new Zend_Acl_Resource('user'));
        $this->add(new Zend_Acl_Resource('auth'));
        $this->add(new Zend_Acl_Resource('xport'));
        $this->add(new Zend_Acl_Resource('msg'));
 
        $this->addRole(new Zend_Acl_Role('invite')); 
        $this->addRole(new Zend_Acl_Role('membre'), 'invite');
        $this->addRole(new Zend_Acl_Role('admin'), 'membre');
 
        // Les invités peuvent uniquement voir le contenu et demander un mot de passe
        $this->allow('invite', 'error');
        $this->allow('invite', 'pay');              
        $this->allow('invite', 'retour');
 
        $this->allow('membre', 'index');        
        $this->allow('membre', 'auth');
        $this->allow('membre', 'user');
        $this->allow('membre', 'dp');
        $this->allow('membre', 'xport');
        $this->allow('membre', 'msg');
 
        $this->allow('admin'); // Accès sans aucune restriction sauf celle d'ajouter une demande
        $this->deny('admin','dp','ajouter');
 
        // Ajout d'un nouvel objet ACL
//Zend_Loader::loadClass('Zend_Acl_Role');
        // NOTE: Zend_Acl dépend de Zend_Auth, il faut toujours lui passer en paramètre pour obtenir l'identité
    }
}
et le plugin utilisé pour ce chargement d'acl dans l'index :

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
<?php
 
class PluginAuth extends Zend_Controller_Plugin_Abstract
{
	private $_auth;
	private $_acl;
 
	private $_noauth = array('module' => 'default',
                             'controller' => 'auth',
                             'action' => 'login');
 
	private $_noacl = array('module' => 'default',
                            'controller' => 'error',
                            'action' => 'privileges');
 
	public function __construct($auth, $acl)
	{
		$this->_auth = $auth;
		$this->_acl = $acl;
	}
 
	public function preDispatch($request)
	{
		/*if (!Zend_Controller_Front::getDispatcher()->isDispatchable($request))
		{
		renvoyer vers une 404
		}*/
		if ($this->_auth->hasIdentity()) {
			$role = $this->_auth->getIdentity()->role;
		} else {
			$role = 'invite';
		}
 
		$controller = $this->getRequest()->getControllerName();
		$action = $this->getRequest()->getActionName();
		$module = $this->getRequest()->getModuleName(); $request->module;
		$resource = $controller;
 
 
		if (!$this->_acl->has($resource)) {
			$resource = null;
		}
 
		if (!$this->_acl->isAllowed($role, $resource, $action)) {
			if (!$this->_auth->hasIdentity()) {
				$module = $this->_noauth['module'];
				$controller = $this->_noauth['controller'];
				$action = $this->_noauth['action'];
			} else {
				$module = $this->_noacl['module'];
				$controller = $this->_noacl['controller'];
				$action = $this->_noacl['action'];
			}
		}
 
		$request->setModuleName($module);
		$request->setControllerName($controller);
		$request->setActionName($action);
	}
}
Si cela peut vous aider à me donner une piste .. voir une solution ...
merci.
vince29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 12h10   #3
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 167
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 167
Points : 6 451
Points : 6 451
Est-tu sur d'être la bonne personne pour encoder des données.

Puisque ACL te renvoie bien sur la page d'erreur estimant que tu n'as pas les droits !
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 12h16   #4
Membre régulier
 
Homme Vincent Leboulanger
Développeur informatique
Inscription : janvier 2005
Messages : 315
Détails du profil
Informations personnelles :
Nom : Homme Vincent Leboulanger
Localisation : France

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

Informations forums :
Inscription : janvier 2005
Messages : 315
Points : 80
Points : 80
Bonjour,

comment ça : "Est-tu sur d'être la bonne personne pour encoder des données."

Par rapport à l'utilisateur utilisé pour l'accès à la BDD ? j'utilise le user "root" qui dispose de tous les privilèges sur la BDD.

Quels autres droits pourrais-je vérifier ?
Merci.
vince29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 12h18   #5
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Petite question aux initiés : dans l'affectation des privilèges aux rôles ne doit on pas définir l'admin en premier lieu puis les rôles dans le sens décroissant de leurs privilèges ?

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
        $this->allow('admin'); 
        $this->deny('admin','dp','ajouter');
 
        $this->allow('membre', 'index');        
        $this->allow('membre', 'auth');
        $this->allow('membre', 'user');
        $this->allow('membre', 'dp');
        $this->allow('membre', 'xport');
        $this->allow('membre', 'msg');
 
        $this->allow('invite', 'error');
        $this->allow('invite', 'pay');              
        $this->allow('invite', 'retour');

Cela peut jouer ou Zend retrouves "ses petits" via Zend_Acl_Role ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 12h27   #6
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 167
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 167
Points : 6 451
Points : 6 451
Citation:
Envoyé par Madfrix Voir le message
Petite question aux initiés : dans l'affectation des privilèges aux rôles ne doit on pas définir l'admin en premier lieu puis les rôles dans le sens décroissant de leurs privilèges ?

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
        $this->allow('admin'); 
        $this->deny('admin','dp','ajouter');
 
        $this->allow('membre', 'index');        
        $this->allow('membre', 'auth');
        $this->allow('membre', 'user');
        $this->allow('membre', 'dp');
        $this->allow('membre', 'xport');
        $this->allow('membre', 'msg');
 
        $this->allow('invite', 'error');
        $this->allow('invite', 'pay');              
        $this->allow('invite', 'retour');

Cela peut jouer ou Zend retrouves "ses petits" via Zend_Acl_Role ?
Non, non ce qu'il fait est correcte, je suis moins sur quand à savoir si il se connecte sur l'appli en tant que admin ou membre, l'appli le renvoie en lui disant qu'il n'a pas les bons droits définit.


Le fait d'avoir un accès root sur MySQL te permettra de travailler sur ta base en dehors de ton application, mais tu ne pourras y accèder au travers de l'appli que si tu as les bons droits !
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 14h17   #7
Membre régulier
 
Homme Vincent Leboulanger
Développeur informatique
Inscription : janvier 2005
Messages : 315
Détails du profil
Informations personnelles :
Nom : Homme Vincent Leboulanger
Localisation : France

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

Informations forums :
Inscription : janvier 2005
Messages : 315
Points : 80
Points : 80
Bonjour,
Je me connectr avec un profil ayant le rôle 'admin', je pense (voir sûre) que c'est bon car mes menus qui s'affichent correspondent à ce qui est définie pour le rôle admin
ex de mon fichier menu.phtml :

Code :
1
2
3
4
5
6
7
8
9
10
<?php if($this->user->role == "admin") : ?>
<ul>
	<li><h2>Commerçants</h2>
	<ul>
		<li><a href="<?php echo $this->baseUrl ?>/com" title="Commerçants">Gérer</a></li>
		<li><a href="<?php echo $this->baseUrl ?>/com/ajouter" title="Ajout Commerçant">Ajouter</a></li>
	</ul>
	</li>
</ul>
<?php endif; ?>
Quels autres droits devrais-je vérifier si ce n'est pas ça ?
Merci.
vince29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 16h51   #8
Membre régulier
 
Homme Vincent Leboulanger
Développeur informatique
Inscription : janvier 2005
Messages : 315
Détails du profil
Informations personnelles :
Nom : Homme Vincent Leboulanger
Localisation : France

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

Informations forums :
Inscription : janvier 2005
Messages : 315
Points : 80
Points : 80
quand je me connecte, j'utilise un user qui a le role admin : table 'user", avec colonne 'role', dont la valeur est 'admin' pour mon user.
Quels sont les droits qui pourrait me manquer? où les voir et les modifier?
merci.
vince29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 14h31   #9
Membre régulier
 
Homme Vincent Leboulanger
Développeur informatique
Inscription : janvier 2005
Messages : 315
Détails du profil
Informations personnelles :
Nom : Homme Vincent Leboulanger
Localisation : France

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

Informations forums :
Inscription : janvier 2005
Messages : 315
Points : 80
Points : 80
Bonjour,

J'ai trouvé la solution tout seul, malgré les différents forums que j'ai pu essayer.
Je vous la fournis au cas ou qu'une autre personne rencontre le même problème :

Dans le fichier index.php, j'ai simplement modifier la définition de la constante 'ROOT_URL'
avant
Code :
define("ROOT_URL","http://zfproject.localhost/zfproject/");
après
Code :
define("ROOT_URL","http://zfproject.localhost/");
A bientôt.
vince29 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 05h49.


 
 
 
 
Partenaires

Hébergement Web