Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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
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
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
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
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
Hors ligne
où, quand et comment doit-on faire appel au modele et au plugin svp ???
Hors ligne
personne pour me donner une réponse ???
Hors ligne
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
$frontController->registerPlugin(new MyPlugin());
merci à Nikko pour son aide sur le forum et en dehors
Hors ligne
hello et comment couplé tout ça avec un formulaire ? de connection
Hors ligne
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 ...
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
<?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
est ce que je peux faire ça dans mon l init de mon indexcontroller ?
$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
faut il que j'ajoute un champs "role" dans ma table user pour faire le lien ?
Hors ligne
Pages: 1