Comment rompre l'héritage des permissions ? [Résolu]

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Drupal est livré avec 2 rôles : anonyme et authentifié.
Le rôle authentifié n'hérite pas des permissions du rôle anonyme. Par contre, tous les autres rôles héritent des permissions du rôle authentifié : est-il possible de rompre cet héritage ?
Voici un exemple concret :
Je souhaite qu'un utilisateur authentifié puisse créer un contenu de type 'adhésion'. Par contre, lorsqu'il l'a créé et qu'il devient adhérent (rôle), je veux qu'il ne puisse plus créer de contenu de type 'adhésion', seulement modifier le sien.

J'ai cherché dans les modules (content access, node permissions grid, ...) mais n'en est pas trouvé répondant à mon problème.

D'avance merci pour votre aide !

Version de Drupal : 

En réalité les rôles n'héritent pas, ils se cumulent.

  • Un visteur a le rôle "utilisateur anonyme"
  • Un Autentifié a les rôles "utilisateur anonyme" + "utilisateur authentifié"
  • Un Utilisateur XXX a les rôles a le rôle "utilisateur anonyme" + "utilisateur authentifié" + tout ceux que tu lui donne.

Donc pour régler ton problème, tu dois créer deux rôles "Utilisateur non abonné" et "utilisateur abonné". A tout ceux qui sont authentifiables, tu ajoutes le rôle "Utilisateur non abonné". Et lorsqu'ils sont passé par la cas adhésion, tu le leur retire pour leur donner le rôle "Utilisateur abonné".

Merci pour ta réponse rapide Yoran.

Ce que tu écris m'étonne, aussi j'ai fait le test suivant :
- J'ai pris un utilisateur A ayant le rôle 'utilisateur anonyme', et un utilisateur B ayant le rôle 'utilisateur authentifié'.
- J'ai donné la permission 'create page content' à l'utilisateur A, et 'edit any page content' à l'utilisateur B (sans 'create page content').

Résultat :
- L'utilisateur A peut créer une nouvelle page, mais ne peut pas en modifier une existante.
- L'utilisateur B ne peut pas créer de nouvelle page, mais peut en modifier une existante.

Conclusion : sauf incompréhension ou erreur de ma part, il n'y a donc ni héritage ni cumul.

A ma connaissance il y a bien cumul, mais pas avec les anonymes. Un role possède tous les droits que tu coches pour lui + ceux cochés pour l'utilisateur authentifié. (c'est d'ailleurs écrit à je ne sais plus quel endroit de l'admin ou dans certains modules)
En revanche il me semble effectivement que les anonymes sont complétement indépendants de cette logique.

Je n'ai jamais eu besoin de rompre l'héritage car il suffit de s'arranger pour que le role authentifié soit celui qui a le moins de droit.

Sinon tu peux aussi utiliser un module du type "node limit" qui interdit à un membre de créer plus de 1 (ou "x") type de node (Une seule fiche adhésion dans ton cas). Rules peut attribuer un role à la création d'un node si besoin.

Mais pourquoi ne pas tout simplement créer un compte pour les adhérents ? Tu peux complètement personnalisé les champs des profils avec un certains modules, de quoi faire de parfaites fiches d'adhésion plutôt que de reconstruire un profil à la main...

Merci nyl auster pour ces pistes.

Je retiens 'node limit' qui peut effectivement répondre à mon attente, et que je vais tester.

Concernant l'intégration de la mécanique d'adhésion directement dans le profil, j'ai commencé par ça car cela me semblait la solution la plus naturelle. Malheureusement, je l'ai (peut-être à tort) rapidement abandonnée, car certaines limites sont apparues. Schématiquement, cette mécanique est la suivante :

  • J'ai notamment défini 2 rôles : 'utilisateur authentifié' (AU) de base, et 'utilisateur adhérent' (AD).
  • un utilisateur AU peut naturellement rester AU (nom utilisateur + mail + password).
  • pour devenir utilisateur AD, il faut être utilisateur AU et faire une demande d'adhésion.
  • si la demande d'adhésion est acceptée (par un rôle 'utilisateur administrateur'), ce qui suppose certaines compétences et le versement de la cotisation, l'utilisateur AU devient AD.
  • Un utilisateur AD peut gérer des informations complémentaires qui lui sont propres (compétences, expériences, sessions de formation, ...), lesquelles sont accessibles sur le site pour n'importe quel internaute.

Si le profil utilisateur (+ éventuellement quelques modules) peut y répondre, alors j'y retourne !

Autant pour moi, effectivement, j'ai revérifié dans le code, le rôle anonyme n'est que pour l'utilisateur 0. Donc grosse connerie de ma part, désolé. En revanche, cela reste vrai pour le reste, le rôle authentifié est cumulé avec les éventuels rôles d'un utilisateur authentifié.

Ceci étant, cela ne remet pas en cause la solution de l'ajout des deux rôles supplémentaires pour ton problème non ?

Ouf, me voilà rassuré...

Dès lors que tous les rôles créés cumulent automatiquement les permissions du rôle 'utilisateur authentifié', je ne vois pas bien en l'état comment je peux obtenir quelque chose comme ceci :
- le rôle 'utilisateur authentifié' possède la permission A et pas la permission B,
- un nouveau rôle 'utilisateur adhérent' (par exemple) ne possède pas la permission A mais possède la permission B.

Dans ce cas et sauf erreur, le rôle 'utilisateur adhérent' possèdera forcément la permission A en plus de la B.

Ben comme je te disais au début, tu crées un 4ième rôle "Utilisateur non adhérent" et tu oublies "utilisateur authentifié" une fois pour toute et tu crées deux nouveaux rôles :
- "Utilisateur non-adhérent" aura le droit de créer un contenu adhésion
- "Utilisateur adhérent" ne l'aura pas.

Ensuite lorsqu'un anonyme demande la création d'un compte, tu lui assigne "Utilisateur non adhérent". Et lorsqu'il a adhéré, tu retires "Utilisateur non-adhérent" et tu lui assignes "Utilisateur adhérent".

Après si tu veux automatiser tout cela, cela doit être réalisable avec les modules standard trigger/actions. Là je n'ai pas vérifié s'il existe une action "retirer/ajouter un rôle" mais ce n'est pas sorcier à fabriquer (où Marie-Hélène va te donner un module magique qui fait cela ;-)

Merci Yoran pour le tuyau !

Comme tu l'indiques, j'oublie le rôle 'utilisateur authentifié' qui ne possède donc aucune permission, et je le remplace par un autre rôle : il n'y a alors plus de cumul, parce qu'il n'y a rien à cumuler... Simple, mais fallait y penser.

Quant à l'attribution automatique dudit rôle, j'utilise déjà le module Rules qui fait cela parfaitement, entre beaucoup d'autres choses.

Passe un bon w-e !

Rules est un module très puissant mais c'est vrai que quand on sait développer l'intérêt est mince. (autant implémenter soi même les hooks).

Dans le cas de ce thread il peut être utile car il permet de gérer un véritable workflow en combinaison avec CCK : par exemple on peut créer un champ CCK pour les nodes de type "adhésion", avec comme état "en attente", "cotisation reçue", "adhésion active"; et à chaque changement de valeur on peut utiliser rules pour ajouter un role, publier le node, envoyer un mail, afficher un message sur le site, rediriger l'utilisateur.
C'est actions et triggers mais en ultra -poussé. (à tel point que j'ai un peu de mal à voir l'interet de actions et triggers étant donné l'existence de rules depuis drupal 5 -sous le nom worflow-ng)

Je n'ai pas de module magique :-) mais c'est une question que je me suis posée : comment faire évoluer le rôle de l'utilisateur ; il y a plusieurs cas (on laisse l'utilisateur choisir, on lui assigne un rôle, on veut pouvoir changer son rôle). La seule manière de changer automatiquement le rôle d'un utilisateur, c'est forcément de provoquer un événement Drupal (un champ change de valeur, l'utilisateur crée un contenu, il publie un commentaire, il vote pour un contenu). Je veux dire que dans le cas présent, le problème consiste à transformer un phénomène extérieur (l'administrateur constate le paiement) en événement Drupal.

Aux solutions proposées, j'ajoute que UserPoints (ah si, j'ai bien un module magique) dispose d'une extension qui permet de changer le rôle d'un utilisateur quand il dépasse un seuil de points déterminé (voire de le lui retirer s'il repasse en dessous). On peut attribuer des points en fonction de plusieurs actions, je ne me souviens plus du détail.

En tout cas le coup de UserPoints m'intéresse dans une logique de gestion karmique des utilisateurs, ce qui est point qui m'est souvent demandé.

Je crois que là tu viens de gagner le grade de grande prêtresse des modules (de la part d'un irlandais, ça a du sens ;-)

Ah oui mais le tiens était plus intéressant je trouve car il permet le passage automatique au rôle "boddisatva" de manière automatique ;-)

Ceci dit, j'avais préparé quelques fiches sur d'obscures modules que je dois être seul à apprécier. Tant qu'à faire, je vais les coller sur drupalistic plutôt que de les mettre sur mon site (un type de contenu en moins, ça m'arrage ;-), pour une fois que ça se secoue sur l'hexagone :-)

Personnellement, je conclurais par un grand merci à toutes et à tous !

Grâce à vous, je pense avoir une solution intéressante pour implémenter les adhésions :
- gérer les rôles en ignorant 'utilisateur authentifié',
- rapatrier les informations dans le profil utilisateur avec le module Content Profile,
- séquencer le tout avec le module Rules.

Pour info, j'ai testé le module Node Limit (seule la version dev est dispo) afin de limiter le nombre de demande d'adhésion à 1 pour un utilisateur non adhérent, le temps qu'il devienne adhérent. Lorsque j'ai validé ma première définition de limite, il m'a joyeusement envoyé une erreur, et plus aucun contenu ne s'enregistrait (affichage d'un contenu de tableau à la place). Prudence étant mère de sûreté, je n'ai pas cherché à comprendre et l'ai désinstallé.

Bon dimanche !

ha étonnant que ce module bug, a priori il est plutôt simple.
Si jamais ça peut te servir voilà un code php que j'utilisais dans rules (conditions : php code):

<?php
//trouver combien de fois ce type de contenu à déjà été crée par l'utilisateur courant, retourne TRUE si il est vrai qu'il a dépassé le maximum autorisé

$type_de_contenu = 'album_musical'; //indiquer quel type de contenu on veut compter
$nb_max = 2; // le nombre qu'on autorise par utilisateur

global $user;
$result = db_query("SELECT nid FROM {node} WHERE type = '%s' AND uid = %d", $type_de_contenu, $user->uid);
$tab = array();
while(
$data = db_fetch_object($result)){
 
$tab[] = $data->nid;
}

if(
count($tab) >= $nb_max){
  return
TRUE;
}
else{
  return
FALSE;
}
?>

Si l'utilisateur a déjà crée plus de type de contenu que autorisé, ça retourne "TRUE". En utilisant cette condition combiné à l'url actuelle, on peut rediriger l'utilisateur vers une autre page si il se rend sur le formulaire de contenu d'un node. Ca permet plus de souplesse que node limit.