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


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.

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?

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

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?

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();
}

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))

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

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!!!!!

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!

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

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)

ton 2eme parametre de ton

Router::connect

doit etre identique à ton 2eme parametre de ton

$this->Html->link