Section: Les concepts généraux de jAcl2
^ jAcl2 : système de droits | Utiliser jAcl2 dans ses modules » |
− Table des matières
jAcl2 propose un système qui répond à la plupart des besoins en matière de gestion de droits. Il comporte divers éléments qui ensemble définissent des droits.
Éléments composant un droit ¶
Il faut distinguer les différents éléments qui entrent en jeu dans le système de droits :
- un nom de droit
- un utilisateur
- une ressource (facultatif)
Une combinaison de chacun de ces types d'éléments représente un droit appliqué.
Droits ¶
Un droit est un libellé représentant une action que pourrait faire un utilisateur.
Par exemple, cms.articles.create
pourrait être le droit de rédaction d'un
article d'un CMS.
Par convention, afin d'éviter les collisions entre différents modules, le nom du droit devrait commencer par le nom du module puis le nom du contrôleur et enfin la valeur de droit. Mais ce n'est pas une obligation.
Exemple :
cms.articles.read
cms.articles.create
cms.articles.update
cms.articles.delete
Jusqu'à Jelix 1.6, les noms des droits étaient nommés des 'sujets'. C'est pourquoi vous pouvez voir dans certaines API, dans les tables SQL ou la documentation, l'utilisation du terme 'sujet' (et dans Jelix 1.7.0 à 1.7.5, ils avaient été renommés de manière innaproprié 'rôles').
Utilisateur ¶
Un droit s'exerce toujours sur un ou plusieurs utilisateurs. Mais cette notion
est transparente du point de vue de l'API de la classe jAcl2
. C'est le
driver qui s'occupe de "reconnaître" l'utilisateur en cours (au moyen de jAuth
en principe). Il se peut même que le driver repose sur un système où les
utilisateurs sont dans des groupes auxquels les droits s'appliquent (comme c'est
le cas de jAcl2.db). Mais vous n'avez pas à vous en préoccuper lors de
l'utilisation de jAcl2.
Ressource ¶
Dans la plupart des cas, l'association droit + utilisateur suffit. Mais parfois on veut pouvoir avoir une granularité plus fine.
Par exemple, dans un système CMS, on veut pouvoir donner le droit de modification à un utilisateur sur ses propres articles, mais pas sur ceux des autres. Il faut alors rajouter dans cette association l'identifiant de l'article.
Par exemple, on donnera les valeurs de droits suivants
- "cms.articles.create" pour le groupe "redacteurs"
- "cms.articles.update" sur la ressource "monarticle" pour l'utilisateur Robert faisant partie du groupe "redacteurs".
Principes de fonctionnement ¶
Le cœur de jAcl2 contient donc des relations entre deux ou trois types d'éléments.
La mémorisation d'une relation entre un droit, un utilisateur (plus éventuellement une ressource), définit un droit appliqué. Quand une relation n'existe pas entre un droit donné et un utilisateur donné, alors cela signifie qu'il n'y a pas de droit assigné à l'utilisateur.
Par exemple, si on définit juste ces droits suivants dans le système :
- "cms.articles.read" pour l'utilisateur "laurent"
- "cms.articles.create" pour l'utilisateur "laurent"
- "cms.articles.update" pour l'utilisateur "laurent"
L'utilisateur laurent aura donc les droits de lecture, création et de modifications sur des articles du CMS, mais pas le droit d'effacer ("cms.articles.delete") puisque la relation n'existe pas.
Un module CMS qui repose sur ces droits devra, pour savoir ce que peut faire un utilisateur, interroger jAcl2, en lui demandant si par exemple l'utilisateur courant a le droit "cms.articles.update". Si oui, alors le module pourra afficher un bouton "modifier" dans l'interface d'administration, et ne l'affichera pas sinon. (Le module devra également faire cette vérification lors de la sauvegarde d'un article, pour éviter les "fraudes" ;-) ).