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 :

[ZF 1.11.0] Problème de privilège


Sujet :

Zend_Acl & Zend_Auth PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    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

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Par défaut
    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 : 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
    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 : 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
    <?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 : 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
    <?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.

  3. #3
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    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 !

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Par défaut
    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.

  5. #5
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/11/2007, 14h29
  2. Problème de privilèges insuffisants
    Par lokazouzou dans le forum Oracle
    Réponses: 1
    Dernier message: 08/10/2007, 09h30
  3. Réponses: 2
    Dernier message: 06/12/2006, 08h54
  4. Problèmes de privilèges pour mes rôles
    Par missbug dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 06/07/2006, 10h31
  5. [10g] Problème de privilège dans une requête
    Par hotkebab99 dans le forum Oracle
    Réponses: 6
    Dernier message: 01/03/2006, 12h00

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