Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 17-04-2009 15:18:09

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

[Résolu][Zend_acl][1.7]Besoin d'explications

Je viens de parcourir différents tutoriaux et autres pages explicative sur le Zend_Acl, mais je ne parviens pas à tout comprendre.

Avant les acl, j'ai bien compris comment mettre en place l'authentification ac Zend_Auth qui au final n'est qu'un controller qui va verifier l'accès à l'aide d'un formulaire.
Au niveau des fonctions de Zend_Acl pour definir les ressources, les roles, l'association entre les deux et l'interrogation de l'oblet acl tout ça je comprend bien le fonctionnement.
Mon souci de conpréhesion se trouve plutot au niveau de la mise en place de tout celà dans un projet zend.

Les différents tutoriaux présents sur le web utilisent chacun leur méthode et je m'y perd un peu.

Pour ma part, j'aimerai avoir simplement un fichier dans lequel je définie mes roles, ressources et associations mais je ne sais pas où créer ce fichier? est-ce qu'il doit s'agir d'un simple fichier php, d'une classe, ... ? comment dois-je lier les droits et l'authentification?

j'ai comme structure de site ceci :

zend_projet
|-->application
         |-->config
         |-->controllers
                 |-->IndexController.php
                 |-->AuthController.php
                 |-->ErrorController.php
         |-->layouts
                 |-->scripts
                         |-->layouts.phtml
         |-->models
         |-->views
                 |-->scripts
                         |-->index
                                  |-->index.phtml
                         |-->auth
                                  |-->login.phtml
                         |-->error
                                  |-->error.phtml
|-->library
|-->public
|-->index.php

Dernière modification par matdev (20-04-2009 16:00:48)

Hors ligne

 

#2 17-04-2009 15:49:35

Nikko
Membre
Lieu: Rueil (Haut-de-Seine)
Date d'inscription: 19-12-2008
Messages: 95

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

Salut matdev,

J'ai bien galérer aussi pour mettre en place les acl. On m'a proposé une solution efficace et très simple à mettre en œuvre. Je te l'expose à mon tour :

Tu créés une classe modèle (/app/models) MyAcl.php qui étend Zend_Acl

Code:

class MyAcl extends Zend_Acl 
{
    private $_acl;
    
    public function __construct($role)
    {
        $this->_role = $role;
        $this->ajouterRoles();
    }
    
    public function ajouterRoles()
    {
        
        //création des rôles
        $this->addRole(new Zend_Acl_Role('user')); // on créé un role correspondant à une personnée authentifiée
        $this->addRole(new Zend_Acl_Role('visiteur'));// on créé un role correspondant à une personnée non-authentifiée
       ...

       //création des ressources
      $this->add(new Zend_Acl_Resource('Index')); // on créé la ressource Index qui correspond au controller Index
       ....
       
       //établissement des règles de droit d'accès
        //pour les personnes non authentifiées
        $this->deny('visiteur', 'Index'); //le visiteur ne peux accéder à l'IndexController
                $this->allow('user', 'Index'); // l'utilisateur authentifié peut accéder à l'IndexController
    }

Pour vérifier si tes Acl sont correctes, tu peux utiliser ce code

Code:

echo $this->isAllowed('visiteur', 'Index') ?
         "autorisé" : "refusé";

Après, j'ai créé un plugin (/app/plugins) MyPluginAuth.php qui va vérifier si l'utilisateur est connecté, et s'il l'est, alors je lui attribut ses droits

Code:

class MyPluginAuth extends Zend_Controller_Plugin_Abstract
{
    private $_auth;
    private $_acl;

    private $_noauth = array('module' => 'default',
        'controller' => 'login',
        'action' => 'index');

    private $_noacl = array('module' => 'default',
        'controller' => 'error',
        'action' => 'privileges');
    
    public function __construct($auth, $acl)
    {
        $this->_auth = $auth;
        $this->_acl = $acl;
    }
    
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {  
        
        if($request->getControllerName() != 'auth')
        {
            if ($this->_auth->hasIdentity())
            {
                  $PER_DROITS = $_SESSION['informations']->PER_DROITS;
                // Recuperer içi le role de l'utilisateur connecté            
                if($PER_DROITS == 1)
                    $_SESSION['acl']['role'] = 'user';
                elseif ($PER_DROITS == 405)
                    $_SESSION['acl']['role'] = 'administrateur';
            }else
                $_SESSION['acl']['role'] = 'visiteur';
            
            $controller = $request->controller;
            $action = $request->action;
            $module = $request->module;
            $resource = $controller;
        
            if (!$this->_acl->has($resource)) 
                $resource = 'Auth';
                    //test si l'utilisateur est autorisé à la ressource (controller) demandé
            if (!$this->_acl->isAllowed($_SESSION['acl']['role'], $resource, $action)) 
            {
                   //n'est pas loggé ==> redirection vers page de login
                if (!$this->_auth->hasIdentity()) 
                {
                    $controller = 'Auth';
                    $action = 'login';
                //n'est pas autorisé ==> redirigé vers la page d'index et non pas vers la ressource demandée
                } else 
                {          
                    $module = 'default';                
                    $controller = 'Index';               
                    $action = 'index';
                }
            }
        //redirection
            $request->setModuleName($module);
            $request->setControllerName($controller);                
            $request->setActionName($action);
        
        }else{
            $_SESSION['acl']['role'] = 'visiteur';
        }
    }
}

Je t'ai mis mon plugin brut... Donc il s'applique à mon application. J'attribue les acl en fonction des droits qui sont stockés en base...

Si tu as besoin d'autres explications, fais signe smile


Nikko

Etudiant en école d'ingénieur à l'INSIA

Hors ligne

 

#3 20-04-2009 09:59:26

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

où, quand et comment doit-on faire appel au modele et au plugin svp ???

Hors ligne

 

#4 20-04-2009 14:24:12

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

personne pour me donner une réponse ???

Hors ligne

 

#5 20-04-2009 16:00:28

matdev
Membre
Date d'inscription: 31-03-2009
Messages: 172

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

C'est bon j'ai réussi à mettre en place mon mix acl/auth. Mon soucis majeur était l'enregistrement du plugin qui se fait dans le bootstrap grace à la methode

Code:

$frontController->registerPlugin(new MyPlugin());

merci à Nikko pour son aide sur le forum et en dehors wink

Hors ligne

 

#6 22-04-2009 08:57:13

Nikko
Membre
Lieu: Rueil (Haut-de-Seine)
Date d'inscription: 19-12-2008
Messages: 95

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

De rien, désolé de ne pas avoir répondu sur le forum. Je me suis rattrapé par mail smile


Nikko

Etudiant en école d'ingénieur à l'INSIA

Hors ligne

 

#7 24-04-2009 15:04:20

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

hello et comment couplé tout ça avec un formulaire ? de connection

Hors ligne

 

#8 24-04-2009 15:28:44

Nikko
Membre
Lieu: Rueil (Haut-de-Seine)
Date d'inscription: 19-12-2008
Messages: 95

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

Salut Forevermoon,

Ta question se pose sur quoi ? l'attribution des droits ou la vérification des login/mdp ?


Nikko

Etudiant en école d'ingénieur à l'INSIA

Hors ligne

 

#9 24-04-2009 15:39:49

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

hello ...

et bien ... en fait j'ai un formulaire pour me connecter ...
je je me rends compte que pour controler mes actions j'utilise pas du tout les roles avec un plugin et j'aimerai faire ça pour l instant je ruse comme ça ...

Code:

function chapitreAction()
        {        
            $user = Zend_Auth::getInstance()->getIdentity();        
            if ((isset($user)) && ($user->real_name == "admin"))
            {
            $this->view->Titre = "chapitre admin";
            $chapitres = new tablechapitre();
            $this->view->chapitres = $chapitres->fetchAll(); 
            }  
            else
            {
            $this->_redirect('/admin/index/connection/');    
            }
        }

et mon loginController

Code:

<?php
class Admin_loginController extends Zend_Controller_Action
{
    function loginAction()
    {             
        $this->view->Titre = "login form...";
        $this -> _helper -> viewRenderer -> setResponseSegment( 'login' );
        $idChapitreGet = (int)$this->_request->getParam('num', 0);
        $idpageDefault = (int)$this->_request->getParam('idpage', 0);

        if ($this->_request->isPost()) {
            
            $formData = $this->_request->getPost();        
            $f = new Zend_Filter_StripTags();
            $username = $f->filter($this->_request->getPost('login'));
            $password = $f->filter($this->_request->getPost('pass'));
            
            if (empty($username)) {
                $this->view->message = 'Please provide a username.';
                
            } else {
                // setup Zend_Auth adapter for a database table
                $config = new Zend_Config_Ini('./application/config/config.ini', 'maconfig');        
    
                // Zend Objet Base de données
  
                 $dbAdapter = new Zend_Db_Adapter_Pdo_Mysql(array(
                'host'     => $config->db->params->host,
                'username' => $config->db->params->username,
                'password' => $config->db->params->password,
                'dbname'   => $config->db->params->dbname
                ));
            
                
                $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
                $authAdapter->setTableName('users');
                $authAdapter->setIdentityColumn('username');
                $authAdapter->setCredentialColumn('password');            
                // Set the input credential values to authenticate against
                $authAdapter->setIdentity($username);
                $authAdapter->setCredential($password);
                // do the authentication
                $auth = Zend_Auth::getInstance();
                $result = $auth->authenticate($authAdapter);
                
                if ($result->isValid()) {
                // success: store database row to auth's storage
                // system. (Not the password though!)
                $data = $authAdapter->getResultRowObject(null, 'password');
                $auth->getStorage()->write($data);
                $this->view->message = "ok";
                $this->_redirect('/admin');
                } else {
                // failure: clear database row from session
                $this->view->message = 'Login failed.';
                }    
            }    
        }
    
        $auth = Zend_Auth::getInstance();
        if (!$auth->hasIdentity()) {
        $form = new Formlogin();        
        $this->view->form = $this->getForm();
        }
    
    
    }
    
    function logoutAction()
    {
    Zend_Auth::getInstance()->clearIdentity();
    $this->_redirect('/admin/index/connection');
    }
    
    public function getForm()
    {
        return new FormLogin(array(
            'action' => "",
            'method' => 'post',
        ));
    }
    
    function preDispatch()
        {
            $auth = Zend_Auth::getInstance();
            if (!$auth->hasIdentity()) {
            //$this->_redirect('/site');
            }
        }
    
   
}

et en plus mon predispatch ne fonctionne pas quand je suis pas connecté

comment je pourrais adapté en utilisant les roles avec un plugin

Dernière modification par forevermoon (24-04-2009 15:41:01)

Hors ligne

 

#10 24-04-2009 15:55:18

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

est ce que je peux faire ça dans mon l init de mon indexcontroller ?

Code:

$acl = new Zend_Acl();
$rolemoi = new Zend_Acl_Role("moi");
$resource = new Zend_Acl_Resource("admin");
$acl->addRole($rolemoi);
$acl->add($resource);
$acl->allow("moi","admin","read","write");

Dernière modification par forevermoon (24-04-2009 15:56:36)

Hors ligne

 

#11 24-04-2009 16:10:35

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: [Résolu][Zend_acl][1.7]Besoin d'explications

faut il que j'ajoute un champs "role" dans ma table user pour faire le lien ?

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages