Bonjour,

J'ai lu la documentation, regardé le tuto-viéo de Grafikart et procédé à l'installation de l'ACL en même temps. Je pensais être prêt à surmonter une nouvelle épreuve, mais non. Ça fait des heures que j'essaye de comprendre, que je cherche sur le net, que je me relis… Quelque-chose doit m'échapper, quoi que j'écrive, quoi que je fasse, même les membres simples ont accès à toute la partie administration !

Voilà quelques bouts de mon code :

  • dans LabController :

    function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allowedActions = array('*');
    }
    function setAcl(){
    $group =& $this->User->Group;
    // Admins
    $group->id = 1;
    $this->Acl->allow($group, 'controllers');
    // Rédacteurs (désactivés pour le moment)
    $group->id = 2;
    $this->Acl->deny($group, 'controllers');
    // Membres
    $group->id = 3;
    $this->Acl->deny($group, 'controllers');

        exit();

    }

  • dans AppController :

    class AppController extends Controller {
    var $components = array('Acl', 'Auth', 'Session');
    function beforeFilter() {
    // Configuration de AuthComponent
    $this->Auth->userModel = 'User';
    $this->Auth->authorize = 'actions';
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
    $this->Auth->logoutRedirect = array('controller' => 'news', 'action' => 'index');
    $this->Auth->loginRedirect = array('controller' => 'news', 'action' => 'index');
    $this->Auth->authError = "Vous n'avez pas les droits pour accéder à cette page...";
    $this->Auth->loginError = "Identifiant(s) incorrect(s)";
    $this->Auth->allowedActions = array('display');
    }

    }

  • dans le modèle User :

    class User extends AppModel {
    var $hasMany=array('News','Comment');
    var $belongsTo = array('Group');
    var $actsAs = array('Acl' => array('type' => 'requester'));

    function parentNode() {
        if (!$this->id && empty($this->data)) {
            return null;
        }
        if (isset($this->data'User']'group_id'])) {
            $groupId = $this->data'User']'group_id'];
        } else {
            $groupId = $this->field('group_id');
        }
        if (!$groupId) {
            return null;
        } else {
            return array('Group' => array('id' => $groupId));
        }
    }

    }

  • dans le modèle Group

    class Group extends AppModel {
    var $hasMany = array('User');
    var $actsAs = array('Acl' => array('type' => 'requester'));
    function parentNode() {
    return null;
    }
    }

Voilà, il doit manquer des fichiers, j'espère avoir mis celui qui contient l'erreur.
Je précise aussi que j'utilise le préfixe admin pour les pages d'administration, je ne suis pas sûr de la façon dont je dois les indiquer dans le setAcl alors, pour le test, j'ai tout interdit. Et ça ne change rien du tout, les membres ont accès à l'index des news (normal, je l'autorise avec Auth) mais aussi à toutes les autres pages dont celles réservées aux administrateurs (sauf celles générées par scaffold)...

Enfin si je ne suis pas connecté du tout, je n'ai pas accès aux pages privées, donc c'est bon.
Mais je n'y comprend rien ! Si vous pouviez m'aider... Je vous en remercie d'avance !

3 réponses


ksianoe
Auteur
Réponse acceptée

Je viens de réussir à résoudre mon problème, en regardant une fois de plus ton tuto, j'ai découvert que j'avais oublié une ligne.
J'avais écris ça dans tout les controllers avec une interface d'admin...

function beforeFilter() {
    $this->Auth->allow('index','voir');
}

... alors qu'il fallait écrire ça :

function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('index','voir');
}

Du coup maintenant tout fonctionne. Mais je ne sais pas vraiment pourquoi, je n'ai rien trouvé dans la doc concernant cette mystérieuse ligne, et du coup je ne sais pas vraiment ce que ça change...

Merci en tout cas de m'avoir fait me pencher à nouveau sur les controllers, c'était la source du problème.

Yaurais moyen d'avoir le code d'un des controller qui ne devrait pas être accessible (celui avec des action admin_)

$this->Auth->allow('index','voir'); el donne acée a voir mais si tu ecrire $this->Auth->allow('index','*'); sa donne accee a tous les fonction