web-dev-qa-db-fra.com

Comment accorder un accès de modification pour des nœuds spécifiques à un ou plusieurs utilisateurs sélectionnés?

Je construis un site d'école sur Drupal 8. Entre autres, j'ai deux types de contenu, un pour les enseignants, un pour les cours. Les enseignants ont également des comptes d'utilisateurs et appartiennent à un rôle, par exemple "enseignant ".

Je souhaite que les enseignants (utilisateurs du site authentifiés appartenant au rôle "enseignant") puissent modifier les pages des cours qu'ils enseignent. Le problème est qu'il y a des cours qui sont enseignés par plus d'un enseignant, donc je ne peux pas résoudre cela simplement en activant "éditer son propre contenu" et en les avoir en tant que propriétaires.

Donc, dans l'ensemble, je veux donner un "accès d'édition" pour des nœuds spécifiques, à des utilisateurs spécifiques, parfois multiples .

J'ai fait des recherches avant de poser cette question assez simple.

Il y a une question très similaire ici - mais elle a quatre ans, et le module d'accès au nœud qui est suggéré comme solution n'est pas utilisable pour Drupal 8 encore.

Il est fait mention d'un autre module, accès flexi , mais qui n'est disponible que pour Drupal 7.

Il y a aussi un lien vers ACL , "une API pour d'autres modules pour créer des listes d'utilisateurs et leur donner accès aux nœuds", mais cela en soi n'est que en pré-version pour Drupal 8, et un module qui semble l'utiliser, Content Access a des problèmes de sécurité ouverts (et est également en état de pré-version)) .

En cherchant, j'ai également trouvé Autorisations par terme module, semble stable et très bien documenté, mais je ne l'ai pas trouvé très intuitif pour être honnête, et il semble également répondre essentiellement à la restriction de l'accès à la vue nœuds (comme suggéré ici , mais aussi à partir de son tutoriel vidéo ).

Je veux quelque chose de plus simple. Et je veux évidemment que tous les nœuds soient toujours visibles par tout le monde (même les utilisateurs anonymes, bien sûr). Donc, bien que les autorisations par terme semblent un choix possible, je ne sais pas si je peux/dois l'utiliser.

Il y a aussi le module de groupe qui est fréquemment référencé, mais cela semble aussi une exagération et beaucoup trop compliqué pour la tâche simple que je veux accomplir.

Je suis un peu perdu sur celui-ci .. Cela semble assez simple, mais je ne trouve pas de moyen de le faire. Toute aide serait grandement appréciée ...

6
thomas

Cela fait longtemps, mais j'ai pensé à répondre à cette question afin que cela puisse être plus utile aux personnes qui se retrouvent ici, à la recherche d'une réponse.

Tout d'abord, je tiens à remercier tous ceux qui ont pris le temps et l'effort d'écrire des réponses et des commentaires - en tant que débutant Drupal moi-même, cela aide beaucoup d'avoir ce genre de rétroaction de la part de plus expérimentés utilisateurs (quelque chose qui, à mon avis, Drupal manque un peu ..)

Quoi qu'il en soit, comme je l'ai mentionné dans ma question, j'avais trouvé un question très similaire mais j'étais réticent à utiliser la réponse car elle était assez ancienne et le module suggéré semblait instable pour Drupal 8 (toujours en version bêta - et avec cette note suggérant: "Ce module a une version préliminaire pour Drupal 8.").

Cependant, j'ai résolu mon problème en utilisant module Nodeaccess mentionné dans ce thread (maintenant âgé de 5 ans) - cela fonctionne bien, bien que toujours en version bêta pour D8. J'ai testé sur un site de développement, puis je l'ai utilisé sur le site de production, et il fait ce que je veux (c'est-à-dire - accorder un accès en modification à des utilisateurs spécifiques, parfois multiples).

Je laisse donc ceci ici pour référence future.

0
thomas

Le module Groupe est ce que vous devriez regarder ... Ce n'est pas un ° overkill ° (comme dans votre question), c'est plutôt le seul module D8 contribué stable disponible aujourd'hui qui répondra également à vos besoins.

Pour cette question spécifique, vous devez activer le sous-module gnode, et pour chaque type de groupe, vous définirez les autorisations appropriées (afficher, modifier, supprimer, etc.) pour les différents types de contenu. Reportez-vous à ma réponse à " Comment configurer l'accès aux cours pour les enseignants et les étudiants? " pour un exemple de configuration.

Remarque :

Permettez-moi d'adresser (une partie de) votre commentaire supplémentaire sous cette réponse également, qui ressemble à ceci:

Je devrai avoir plusieurs groupes dans mon cas - un pour chaque cours enseigné par plus d'un enseignant.

Si je devais configurer le module Groupe pour votre cas, j'utiliserais une approche comme celle-ci:

  • Créez un type de groupe = Cours.
  • Créer des rôles de groupe = enseignant et étudiant.
  • Créez exactement 1 groupe pour chaque cours possible, étiqueté (disons) C1, C2, C3, ....
  • Accordez uniquement l'autorisation de groupe pour "modifier" un nœud de type de contenu "Cours" aux utilisateurs qui ont reçu le professeur "Rôle de groupe". Et selon votre " je veux que tous les nœuds soient toujours visibles publiquement par n'importe qui (même les utilisateurs anonymes)", vous voulez accorder l'accès "View" à "Outsiders" et "Anonymous", et probablement aussi aux "étudiants".
  • Si seul l'enseignant (utilisateur) T1 enseigne le cours C1, seul T1 reçoit le rôle de groupe "Enseignant" pour (groupe) C1.
  • Si les enseignants (utilisateurs) T2 et T3 enseignent le cours C2, seuls T2 et T3 reçoivent le rôle de groupe "Enseignant" pour (groupe) C2.
  • Lors de la création de nœuds de type "Course", affectez-les à 1 (et un seul) groupe (donc C1, C2 ou C3, ou ...). Et décidez quel (s) enseignant (s) (utilisateur (s)) Tx le cours nouvellement créé se verra attribuer le rôle de groupe "enseignant".

Terminé ...

Ressources

6
Pierre.Vriens

Si vous avez un type de contenu course avec un champ de référence d'entité field_teachers vous pouvez activer la modification pour plusieurs utilisateurs comme ceci:

mymodule.module:

use Drupal\node\NodeInterface;
use Drupal\Core\Access\AccessResult;

/**
 * Implements hook_node_access().
 */
function mymodule_node_access(NodeInterface $node, $op, $account) {
  $type = $node->bundle();

  if ($type != 'course' || $op != 'update') {
    return AccessResult::neutral();
  }

  $uids = array_column($node->field_teachers->getValue(), 'target_id');

  return AccessResult::allowedIf(in_array($account->id(), $uids))->cachePerUser()->addCacheableDependency($node);
}

Si field_teachers ne fait pas référence à des utilisateurs mais à un autre type de contenu, l'uid de l'enseignant est probablement stocké dans le type de contenu référencé et vous devez récupérer l'uid de chaque enseignant à partir de là. Dans ce cas, ajoutez tous les nœuds impliqués en tant que dépendances pouvant être mises en cache, de sorte que lorsque le nœud d'un enseignant est modifié avec un uid différent, le résultat de l'accès est invalidé.

5
4k4

Vous pouvez regarder dans le module Workbench Access . Cela vous permet de restreindre les droits d'édition aux nœuds en fonction de la structure des menus ou d'une taxonomie.

Vous pouvez créer un vocabulaire de taxonomie pour les différents groupes d'éditeurs. Les exemples de termes peuvent être Mathématiques de 4e année, Sciences de 5e année, etc., ou même simplement Mathématiques, Sciences, etc. Ajoutez un champ de référence de taxonomie à votre nœud Cours, qui est utilisé pour affecter votre contenu à vos groupes. Ensuite, vous pouvez affecter vos utilisateurs (enseignants) au bon groupe (qui est basé uniquement sur votre vocabulaire de taxonomie) et tous les enseignants du groupe peuvent modifier le nœud.

Vous pouvez implémenter une situation dans laquelle chaque cours crée automatiquement un terme de taxonomie lorsqu'un nœud de cours est créé. Vous pouvez le faire avec hook_ENTITY_TYPE_insert .

Quelque chose comme ceci:

function hook_node_insert($node) {
  if ($node->bundle() == 'course') {
    // Check if a term with the $node->title() already exists. (See below [1])
    // Or create a term (See below [2])

    // Then set your taxonomy term reference field with the new tid, or existing tid
    $node->field_my_tax_group_field[] = ['target_id' => $the_tid];

    // Then save the node.
    $node->save();
  } 
}

Si vous utilisez cette technique, la seule chose que vous devrez faire manuellement après avoir créé un nœud de cours est d'affecter les bons utilisateurs au groupe pour leur permettre de le modifier.

[1] Vérifiez s'il existe un terme .

[2] Créer un nouveau terme de taxonomie

2
sonfd

Groupes organiques est une autre option très utilisée dans certaines instances de D7, et comme d'autres contrib, pas entièrement prête pour D8. Même s'il est prêt pour les heures de grande écoute, il a un peu de courbe d'apprentissage, mais peut être très pratique. Un cas d'utilisation (bien que toujours en D7) similaire à vos besoins est COD (Conference Organizer Distribution), qui est utilisé pour exécuter des événements majeurs comme DrupalCon.

Vous voudrez peut-être voir si cela fonctionne pour vous - mais soyez prévenu - certaines architectes de solutions avec lesquelles je travaille ont été assez frustrés par la version D8. Cela est dû aux changements architecturaux importants entre D7 et D8, mais cela peut fonctionner dans votre cas.

1
karolus