// BLOG

Kirby CMS - Rôles et permissions des utilisateurs.trices

Un site web basé sur un gestionnaire de contenu peut nécessiter que tous ses utilisateurs ou utilisatrices n'est pas les mêmes droits sur les actions à effectuer ou sur les accès aux données. Si c'est le cas dans votre projet, savoir comment définir différents rôles et permissions sur vos utilisateurs.trices va vous être très utile.

Rédigé le 11.11.2022
Par Gilles Vauvarin

Permissions Rôles Utilisateurs Kirby CMS

Les rôles

Les rôles désignent les différents types d'utilisateurs.trices qui pourront se connecter au panel de notre projet Kirby. Un rôle d'utilistateur.trice se distingue d'un.e autre par les permissions qu'ils lui seront accordées.

Par défaut, Kirby lors de son installation, va créer un utilisateur.trice "Admin" qui aura tous les droits sur la gestion du contenu et des autres utilisateurs.trices.

Comment créer de nouveaux rôles ?

Pour créer un nouveau rôle, c'est simple, il suffit de créer un nouveau fichier Yaml dans le dossier blueprints de Kirby et plus particulièrement dans le dossier /site/blueprints/users

Par exemple, si je souhaite créer un nouveau rôle "Editeur" dans mon projet Kirby, je vais créer le fichier /site/blueprints/users/editor.yml

title: Editeur

description: 
  en: The editor can edit post
  fr: L'éditeur peut modifier less articles
  
permissions:
  access:
    panel: true
    site: true
    settings: false
  pages:
    create: true
    changeTemplate: false
    changeTitle: true
    changeSlug: false
    delete: true
    hide: false
    sort: false
    update: true


tabs:
  editorInfos:
    label: 
      en: Identity
      fr: Identité
    icon: user
    columns:
      - width: 1/1
        fields:
          userGender:
            ...

Vous pouvez biensure créer autant de nouveaux rôles que vous le désirez en fonction des besoins du projet. Seul le titre dans votre fichier Yaml est obligatoire. Mais si vous souhaitez créer un formulaire spécifique pour la page "user" de ce rôle, c'est dans ce fichier que vous définirez l'aspect et les champs.

Comme vous l'observez dans cet exemple de code,vous pouvez définir dans les blueprints "users" des permissions, c'est ce que nous allons voir dans le chapitre suivant.

Les permissions

Les permissions servent à restreindre l'accès à certaines données et/ou les capacités d'un.e utilistateur.trice à effectuer certaines tâches dans l'application.

En revanche, vous ne pouvez pas réstreindre les permissions d'un utilisateur.trice "Admin".

Ces permissions peuvent être définies à deux endroits :

  • Dans les blueprints users /site/blueprints/users/role.yml
  • Dans les blueprints pages, site et files /site/blueprints/pages/post.yml /site/blueprints/site.yml /site/blueprints/files/image.yml
La définition des permissions au niveau des blueprints pages, site et files permet un contrôle plus fin de ces permissions.

Permissions au niveau des blueprints "users"

Voici une vue d'ensemble des permissions que vous pouvez définir dans une blueprint user :

# /site/blueprints/users/editor.yml

title: Editor

permissions:
  access:
    panel: true
    site: true
    languages: true
    system: true
    users: true
  files:
    create: true
    changeName: true
    delete: true
    read: true
    replace: true
    update: true
  languages:
    create: true
    delete: true
  pages:
    changeSlug: true
    changeStatus: true
    changeTemplate: true
    changeTitle: true
    create: true
    delete: true
    duplicate: true
    preview: true
    read: true
    sort: true
    update: true
  site:
    changeTitle: true
    update: true
  user:
    changeEmail: true
    changeLanguage: true
    changeName: true
    changePassword: true
    changeRole: true
    delete: true
    update: true
  users:
    changeEmail: true
    changeLanguage: true
    changeName: true
    changePassword: true
    changeRole: true
    create: true
    delete: true
    update: true

Les libelés de ces permissions sont assez explicites. La valeur true donne la permission, la valeur false retire la permission.


Par exemple si on souhaite donner à l'utilisateur.trice la permission de créer de nouvelles pages mais pas la permission d'en supprimer on écrira les permissions de la façon suivante :

# /site/blueprints/users/editor.yml

title: Editor

permissions:
  
  pages:
    create: true
    delete: false

Ces permissions sont classées par catégories :

access

Les permissions de la catégorie access s'appliquent à l'accès des items du menu présent en haut à gauche du panel.

# /site/blueprints/users/editor.yml

title: Editor

permissions:
  access:
    panel: true
    site: true
    languages: true
    system: true
    users: true

L'option panel permet de donner la permission à un utilisateur.trice d'accéder ou pas au panel. Les autres options donnent la permission d'accès aux différents items de ce menu.

files

Les permissions de la catégorie files s'appliquent à l'accès des items du menu des fichiers mais aussi sur la possibilité d'ajouter (create) un fichier.

/site/blueprints/users/editor.yml

title: Editor

permissions:
  files:
    create: true
    changeName: true
    delete: true
    read: true
    replace: true
    update: true

languages

Les permissions de la catégorie languages s'appliquent à l'accès des items du menu des langues. Ce menu est visible uniquement si vous avez activé l'internationalisation dans votre projet.

/site/blueprints/users/editor.yml

title: Editor

permissions:
  languages:
    create: true
    delete: false

pages

Les permissions de la catégorie pages s'appliquent à l'accès des items du menu des pages ainsi qu'à la possibilité d'ajouter (create), éditer (update) et trier (sort) les pages.

# /site/blueprints/users/editor.yml

title: Editor

permissions:
  pages:
    changeSlug: true
    changeStatus: true
    changeTemplate: false
    changeTitle: true
    create: true
    delete: true
    duplicate: true
    preview: true
    read: true
    sort: false
    update: true

site

Les permissions de la catégorie site s'appliquent aux possibilités de modifier le titre du site et d'éditer (update) les champs de la page site.

# /site/blueprints/users/editor.yml

title: Editor

permissions:
  site:
    changeTitle: true
    update: true

user

Les permissions de la catégorie user s'appliquent à la possibilité de changer les informations (mail, langue, name, password, rôle) de son propre compte utilisateur.trice ainsi que la possibilité de le supprimer (delete) ou l'éditer (update).

# /site/blueprints/users/editor.yml

title: Editor

permissions:
  user:
    changeEmail: true
    changeLanguage: true
    changeName: true
    changePassword: true
    changeRole: false
    delete: false
    update: true

users

Les permissions de la catégorie users s'appliquent à la possibilité de changer les informations (mail, langue, name, password, rôle) des autres utilisateurs.trices ainsi que la possibilité d'ajouter (create), supprimer (delete) ou éditer (update) un.e utilisateur.trice.

# /site/blueprints/users/editor.yml

title: Editor

permissions:
  users:
    changeEmail: true
    changeLanguage: true
    changeName: true
    changePassword: true
    changeRole: false
    create: true
    delete: false
    update: true

Permissions (options) au niveau des blueprints de site, pages et files

Jusqu'ici, nous avons vu comment définir des permissions à certains types d'utilisateurs.trices au niveau des blueprints "user" /blueprints/users/editor.yml Lorsque je définie une permission de suppression de page pour les utilisateurs.trices "editor" par exemple, je permets à ce type d'utilisateurs.trices de supprimer toutes les pages quelque soit le type (template) de page.

Vous pouvez affiner ces permissions de façon individuelle, afin d'être plus spécifique. Pour cela il faut re-définir les permissions au niveau d'une blueprint de page, de site, de user ou de fichier en utilisant le mot clé options

Prenons un exemple pour que ce soit plus clair :

Je souhaiterais que les utilisateur.trice ayant le rôle "editor" aient la permission de supprimer tous les types de page sauf celles de type "projects" (celles rattachées au template projects).

Dans la blueprint des users ayant le rôle "editor" je donne la permission de supprimer les pages quelque soit le template auquelles elles sont rattachées :

# /site/blueprints/users/editor.yml 

title: Editor 

permissions: 
  pages: 
     delete: true

Puis pour indiquer que les utilisateurs.trices ayant le rôle "editor" ne puissent pas supprimer les pages rattachées au template "projects", je rajoute cette option dans la blueprint "projects" :

# /site/blueprints/pages/projects.yml 

title: Project 

options: 
  delete: false

Si je souhaite que cette option n'affecte que les utilisateurs.trices ayant le rôle "editor" mais pas les "admin", je peux le préciser de la façon suivante :

# /site/blueprints/pages/projects.yml 

title: Project 

options:
  delete:
    admin: true
    editor: false

Imaginons maintenant que nous ayons d'autres rôles que "admin" et "editor" et que nous voulions que seul les users "editor" ne puissent pas supprimer les pages de type "projects". Je peux soit indiquer la permission pour chaque rôle soit utiliser un wilcard * comme raccourci :

# /site/blueprints/pages/projects.yml 

title: Project 

options:
  delete:
    *: true
    editor: false

Contrôle encore plus fin des permissions grâce aux hooks

Si vous avez besoin d'un contrôle des permissions encore plus fin, vous pouvez utiliser les Hooks en ciblant les hooks de type :before

Par exemple, si je souhaite que tous les users ayant une adresse mail se terminant par "@student.edu" ne puissent pas effacer les pages de type "test" je pourrais utiliser le hook page.delete:before de la façon suivante :

// /site/config/config.php

return [
  'hooks' => [
    'page.delete:before' => function (Page $page) {
      if ( $page->template() == 'test' && str_contains( $this->user()->email() , '@student.edu') ) {
        throw new Exception('Sorry but student can't delete test pages');
      }
    }
  ]
];

Permissions pour les utilisateurs.trices connectées

Vous pouvez également avoir besoin d'autoriser des actions ou accès à certaines pages Front uniquement à vos utilisateurs.trices connectées. Par exemple dans le cadre d'un espace membre. Dans ce cas, vous pouvez simplement tester si votre utilisateur.trice est connectée et si oui autoriser l'action ou l'affichage de l'information.

// /site/templates/member.php

if ( $kirby->user() ) : // Je vérifie si le user courrant est connecté

  echo '<div>You can see this because you are connected!'</div>;

endif;

Permissions pour des actions programmées

Certaines actions, comme l'ajout ou la suppression d'une page, ne peuvent être effectuées que par un.e utilisateur.trice autorisée par ses permissions ET connecté au panel. Mais parfois, nous avons besoin d'effectuer ces actions par notre programme. Par exemple lorsque je veux créer un formulaire d'enregistrement de nouveaux utilisateurs.trices côté front, si les paramètres saisies sont valides, mon programme doit pouvoir créer cet.te utilisateur.trice.

Dans ce cas, nous allons nous faire passer pour le super utilisateur "Kirby" qui possède tous les droits. Cela se fait à l'aide de la méthode impersonate() de l'objet kirby

// /site/controllers/member.php

$kirby = kirby();
$kirby->impersonate('kirby'); // Authentification en tant qu'utilisateur "Kirby"

page('test/test-1')->delete(); // suppression d'une page de type "test"

Conclusion

Nous avons vue comment définir plusieurs rôles dans notre projet Kirby. Cela peut être très utile pour paramétrer ensuite des permissions plus ou moins étendue selon le profil de l'utilisateur.trice. Cela n'a pas été traité dans cet article mais il serait également possible de proposer un panel spécifique pour chaque type de rôle. Kirby, une fois de plus montre une grande flexibilité qui lui permet de s'adapter à de nombreux types de projets.

Vidéo YouTube

Disponible prochainement ...