Bonjour,
Je suis sur un projet de web magazine ouvert et participatif (CakePHP2.5). Pour le "power admin pas de souci, j'ai utilisé la méthode du préfixage des actions dans les controller avec le préfixe "admin_myfunction".

Mais tous les inscrits peuvent aussi publier des articles (niveau auteur), donc j'ai 2 questions :

  • Comment créer un niveau "auteur", qui lui pourrait accéder à des fonctions auxquelles le simple visiteur "non-inscrit" ne peut pas. (par exemple créer des article) ? Par le préfixage aussi, ou une autre méthode est plus appropriée ?

  • Comment faire en sorte qu'un auteur ne puisse pas modifier l'article d'un autre auteur, en dehors du bout de code qui testerai à chaque fonction que l'article lui appartient bien en BDD ? (J'ai entendu parler de l'access Token mais je ne connais pas vraiment le fonctionnement) ?

Ces questions de sécurité et de droits d'accès étant un pilier de ce projet, je ne veux pas me tromper :)

Merci par avance de vos réponse.

4 réponses


FactureHero.com
Auteur
Réponse acceptée

Alors en fait je ne suis pas fan d'un plugin tout fait pour faire ça :) J'ai construis un syteme de role. Mon problème était finalement bien plus basique et je l'avais mal formulé (mea culpa :) ) , c'était plutôt une histoire de droits à l'intérieur d'un même rôle.

Je reviens ici pour donner ma solution si elle peut servir à d'autres, car c'est un problème que l'on peut rencontre sur des sites ouverts.

Exemple concret : Je ne voulais pas que les auteurs puissent accéder à l'édition des articles des autres via l'URL. J'ai mis en place une solution simple que j'ai trouvé dans la Doc. de cake. faire une fonction au niveau de mon modèle, que je peux appeler dans mes actions. LA fonction test que le contenu appartient bien à l'user en question et dans le modèle post par exemple ça donne ça :

// app/Model/Post.php
public function isOwnedBy($post, $user) {
    return $this->field('id', array('id' => $post, 'user_id' => $user)) !== false;
}

Ensuite je n'ai plus qu'à tester dans l'action edit de mon controller Post comme ceci :

// je test que le contenu appartient bien au user 
 if ($this->Post->isOwnedBy($postId, $user['id'])) {
        // Ok tu peux éditer ton contenu
        }
 else {
 // non tu ne peux pas accéder à l'édition de ce contenu
 }

Voilà pour la solution, simple mais efficace :) en espérant que ça serve à d'autres.

Salut pourquoi tu ne parts pas sur le plugins de CakeDC : https://github.com/cakedc/users/tree/master ?

Avec tu peux vraiment gérer les permissions (exemple):

<?php
 return [
        'Users.SimpleRbac.permissions' => [
            [
                'role' => 'user',
                'controller' => 'Posts',
                'action' => ['view'],
            ],
        ]
    ];

Après avec ça il est relativement aisé de vérifier si la personne ayant le grade "auteur" à le même id que l'auteur du sujet

Juste pour information, ce que tu montres boostyweb.fr, c'est un exemple qui est donné dans le Tutoriel d'un blog, dans la documentation de CakePHP. :p

@Lartak oui et je le dis bien dans mon post plus haut ;) "... J'ai mis en place une solution simple que j'ai trouvé dans la Doc. de cake..."

C'est la bonne solution ou tu penses qu'il y a mieux pour ça ? Ca marche bien, ça me paraît light, je ne vois pas trop comment faire autrement en fait.