[ACL] Comment créer un gestionnaire des permissions

Par pierrot10, il y a 12 ans


Bonjour,
J'ai mis en place l'ACL et ca semble bien fonctionner.

J'aimerais pouvoir changer mes permissions sans passer par la console et j'ai vu qu'il y a ds truc du genre
Gestionnaire d'ACL
Ou l'on peut meme syncroniser les acos.

J'aimerais savoir si quelqu'un connaitrait une facon d'implémenter ceci, une librairie, un tuto?

13 réponses

makamo, il y a 12 ans

Salut

Un petit plugin génial que j'utilise
https://github.com/FMCorz/AclManager

qui fonctionne tres bien et qui te donne une interface comme tu veux.
ensuite tu n'as qua modifier la vue dans le plugin pour y metre le style que tu souhaite.

pierrot10, il y a 12 ans

Ha oui, je suis en train de regarder celui ci mais je n'arrive pas a le faire fonctionner.
Je pense que c'est a cause e mon beforeFind, tu peux me filer un coup de pouce?

pierrot10, il y a 12 ans

En fait, j'ai

  1. J'ai deziper le zip dans
    /app/plugin/AclManager/
  2. Dans bootstrap.php j'ai mis ceci :
    CakePlugin::load('AclManager', array('bootstrap' => true));
  3. Danns /app/plugin/AclManager/Config/bootstrap, j'ai modifier cette ligne :
    Configure::write('AclManager.aros', array('Group', 'User'));

Avant il y avait Role à la place de Group, car dans mon AROS j'ai des Group et pas des Role.

Ensuite je pense que mon problème vient de la;
Mon beforeFinde de mon AppController est le suivant

function beforeFilter(){
        $this->Auth->loginAction = array('controller'=>'users','action'=>'login','admin'=>false);
        //$this->Auth->authorize = array('controller'); //action, cron, controller

        if(!isset($this->request->params'prefix'])){
            parent::beforeFilter();
            $this->Auth->allow();
        }else{
        }
        // Permet de définir le layout à utiliser au lieux de celui par defaut (admin_index)
        if(isset($this->request->params'prefix']) && $this->request->params'prefix'] == 'admin'){
            $this->layout='admin';
        }
    }

J'ose pas trop le modifer (je suis débutant) pyr crainte que ce que j'ai fait ne marche plus.... :o)

Es-ce que j'ai loupé un truc?

Milles merci

pierrot10, il y a 12 ans

J'ai rwmarqué que quand je vais sur
localhost:8888/cakephp/AclManager/acl

Missing Controller
Error: AclManager.PagesController could not be found.
Error: Create the class PagesController below in file: /Applications/MAMP/htdocs/cakephp/app/Plugin/AclManager/Controller/PagesController.php

Je ne devrais pas avoir besoin de créer un controller?

makamo, il y a 12 ans

Est ce que tu a regénérer tes aco ?
Est ce que tu utilises le plugin acl_extra ?
tu ne peux surement pas y acceder car acl ne sais pas que ce plugin existe donc il te bloque

et est ce que tu as ajouter ceci apres ton beforeFilter dans ton appController ?

function isAuthorized($user) {
    // return false;
    return $this->Auth->loggedIn();
}
pierrot10, il y a 12 ans

Oui alors excuse moi.
Oui j'ai créé ma table ACOS, AROS et AROS_ACOS.

Quand je crée un utlisateur ou un groupe, la table AROS se met bien a jour.

Aussi, depuis ma console, j'ai executé la commande
./cake AclExtras.AclExtras aco_sync

et ma table ACOS s'est complétée.

Finalement j'ai exécuté cette fonction, pour tester (j'espère qu'il n'y a pas d'errur) qui se trouve dans mon AclController, et ma table AROS_ACOS, c'est remplie.

public function initACL() {
        $group = $this->User->Group;
        //Allow admins to everything
        $group->id = 1; // Super administrator
        $this->Acl->allow($group, 'controllers');
        //allow managers to posts and widgets
        $group->id = 2; // Administrator
        $this->Acl->deny($group, 'controllers');
        $this->Acl->allow($group, 'controllers/Users/logout');
        $this->Acl->allow($group, 'controllers/Posts');
        $this->Acl->allow($group, 'controllers/Pages');
        /*
        $this->Acl->allow($group, 'controllers/Settings');
        $this->Acl->allow($group, 'controllers/Users');
        $this->Acl->allow($group, 'controllers/Groups');
        $this->Acl->allow($group, 'controllers/Filemanager');
        $this->Acl->allow($group, 'controllers/Categories');
        */

        //allow users to only add and edit on posts and widgets
        $group->id = 3; //Editor of all pages
        $this->Acl->deny($group, 'controllers');
        $this->Acl->allow($group, 'controllers/Users/logout');
        $this->Acl->allow($group, 'controllers/Posts');
        $this->Acl->allow($group, 'controllers/Pages');
        $this->Acl->allow($group, 'controllers/Categories');
       // $this->Acl->allow($group, 'controllers/Socials');
        $this->Acl->allow($group, 'controllers/Posts');
        $this->Acl->allow($group, 'controllers/Filemanager');

        //allow users to only add and edit on posts and widgets
        $group->id = 4; //Editor page
        $this->Acl->deny($group, 'controllers');
        $this->Acl->allow($group, 'controllers/Users/logout');
        $this->Acl->allow($group, 'controllers/Pages/admin_edit');
        $this->Acl->allow($group, 'controllers/Filemanager');

        $group->id = 5; // Editor Post
        $this->Acl->deny($group, 'controllers');
        $this->Acl->allow($group, 'controllers/Users/logout');
        $this->Acl->allow($group, 'controllers/Posts/admin_edit');
        $this->Acl->allow($group, 'controllers/Filemanager');
        //nous ajoutons un exit pour éviter d'avoir un message d'erreur affreux "missing views" (manque une vue)
        echo "tout est ok";
        exit;
    }

Si dans AclController, dans l'action admin_index, je met ca:

$user = $this->Auth->user();   

        $checkPerm = $this->Acl->check(array(
            'model' => 'Group',
            'foreign_key' => 1
        ), 'Posts/admin_edit');
        debug($checkPerm);

Ben j'ai un true pour l'utilisateur de mon group 1 et un false pour l'utilisateur de mon group 4

Donc ca semble fonctionner.

Oui j'ai ajoutl ceci après le beforeFind
function isAuthorized($user) {
// return false;
return $this->Auth->loggedIn();
}

Aussi, information complémentaire, dans mon AppController, j'ai aussi ceci:

public $components = array(
        'Acl',
        'Auth' => array(
             // For the ACL
            'authorize' => array(
                'Actions' => array('actionPath' => 'controllers')
            ),
            // Mets des condition au niveau de la validation d'authentificate
            // Contient l'ensemble des methode d'authentification
            'authenticate' => array(
                // Mehtode Form est utilisée
                'Form' => array(
                    // Defini les paramêtre scope. Ici défini que le compte doit est actif
                    'scope'=> array('User.active' =>1)
                )
            )
        ), 
        'Session'
    );

Me reste plus qu'a le géré :o))

pierrot10, il y a 12 ans

Un autre truc intéressant,
Dans /app/plugin/AclManager/Conf/bootstrap/m j'ai clcommenté cette ligne

Configure::write('AclManager.prefix', 'admin');

Donc depuis, je peux aller sur
localhost:8888/cakephp/admin/acl_manager/acl

Cependant j'ai un nouveau message d'erreur

Warning (512): DbAcl::check() - Failed ARO/ACO node lookup in permissions check. Node references:
Aro: Array
(
    [User] => Array
        (
            [id] => 1
            [username] => superadmin
            [email] => info@hello.net
            [firstname] => 
            [lastname] => 
            [birthday] => 2013-12-12
            [group_id] => 1
            [role] => admin
            [active] => 1
            [activationcode] => 
            [created] => 2013-12-02 14:53:29
            [lastlogin] => 2013-12-05 16:25:53
            [Group] => Array
                (
                    [id] => 1
                    [name] => Super
                    [created] => 2013-12-02 14:52:55
                    [modified] => 2013-12-04 23:45:13
                )
        )
)
Aco: controllers/AclManager/Acl/index [CORE/Cake/Model/Permission.php, line 92]
Permission::check() - CORE/Cake/Model/Permission.php, line 92
DbAcl::check() - CORE/Cake/Controller/Component/Acl/DbAcl.php, line 74
AclComponent::check() - CORE/Cake/Controller/Component/AclComponent.php, line 110
ActionsAuthorize::authorize() - CORE/Cake/Controller/Component/Auth/ActionsAuthorize.php, line 40
AuthComponent::isAuthorized() - CORE/Cake/Controller/Component/AuthComponent.php, line 462
AuthComponent::startup() - CORE/Cake/Controller/Component/AuthComponent.php, line 307
ObjectCollection::trigger() - CORE/Cake/Utility/ObjectCollection.php, line 132
call_user_func - [internal], line ??
CakeEventManager::dispatch() - CORE/Cake/Event/CakeEventManager.php, line 247
Controller::startupProcess() - CORE/Cake/Controller/Controller.php, line 675
Dispatcher::_invoke() - CORE/Cake/Routing/Dispatcher.php, line 182
Dispatcher::dispatch() - CORE/Cake/Routing/Dispatcher.php, line 160
[main] - APP/webroot/index.php, line 92
pierrot10, il y a 12 ans

Ok j'ai trouvé et c'est tout con.
J'ai installé comme il le faut, sauf que mes ACOS n'avais pas été mis a jour par le fait qu'il y a un nouveau Controller : AclManager....

Je suis allé dans mon terminal et j'ai lancé la commande.
./cake AclExtras.AclExtras aco_sync

Puis ensuite je suis allé dans

localhost:8888/cakephp/admin/acl_manager/acl et la je suis tombé sur une page ou je peux controller mes ACL.

Ca semble bon, je vais essayé tout ca!!!!!

pierrot10, il y a 12 ans

Ca l'air tro top.

Petite et derniere question, je ne peux pas avoir ce plugin dans /app/controller/, comme j'ai tous les autre?

Quel est l'aventage d'un plugin sur un Controller comme /app/Controller/UsersController.php??
ou encore : /app/Controller/AclmanagerController.php???

Milles mercis pour votre réponse!

makamo, il y a 12 ans

Un plugin est réutilisable plus facile à distribuer et tu n'as qua retravailler la route pour que ca resemble au reste de ton application

pierrot10, il y a 12 ans

Salut merci pour ta réponse.
Ben c'est ce que j'éssaye de faire

J'ai réussi a fair un routing avec mon lien

<?php echo $this->Html->link("ACLs",array('controller'=>'acl_manager','action'=>'acl'),array('class'=>'')); ?>

Mon plugin se trouve dans

/app/plugin/acl_manager

je charge mon plugin ainsi:

CakePlugin::load('AclManager', array('bootstrap' => true));

Donc quand je clique sur mon lien, mon URL est:

http://localhost:8888/cakephp/admin/acl_manager/acl

mais j'aimerais avoir

http://localhost:8888/cakephp/admin/acl

J'ai donc essayé de modifier mon route ainsi mais sans succès

Router::connect('/admin/acl',array('plugin'=>'AclManager','controller'=>'acl_manager','action'=>'acl'),'ACL');

Je vais encore cherche à corriger mon Route:: mais pour le moment c'est... bof :o)

makamo, il y a 12 ans

ton 2eme parametre de ton

Router::connect

doit etre identique à ton 2eme parametre de ton

$this->Html->link