it-swarm.com.de

Wie kann ich einem oder mehreren ausgewählten Benutzern den Bearbeitungszugriff für bestimmte Knoten gewähren?

Ich baue eine Schulwebsite auf Drupal 8. Unter anderem habe ich zwei Inhaltstypen, einen für Lehrer und einen für Kurse. Lehrer haben auch Benutzerkonten und gehören einer Rolle an, beispielsweise "Lehrer".

Ich möchte, dass Lehrer (authentifizierte Site-Benutzer, die zur Rolle des Lehrers gehören) die Seiten der Kurse bearbeiten können, die sie unterrichten. Das Problem ist, dass es Kurse gibt, die von mehr als einem Lehrer unterrichtet werden. Daher kann ich dies nicht einfach lösen, indem ich "Eigene Inhalte bearbeiten" aktiviere und sie als Eigentümer habe.

Alles in allem möchte ich bestimmten, manchmal mehreren Benutzern den Bearbeitungszugriff für bestimmte Knoten gewähren.

Ich habe recherchiert, bevor ich diese ziemlich einfache Frage gestellt habe.

Es gibt hier eine sehr ähnliche Frage - jedoch vier Jahre alt, und das als Lösung vorgeschlagene Knotenzugriffsmodul ist für Drupal 8 noch.

Es wird ein anderes Modul erwähnt, flexi access , das jedoch nur für Drupal 7 verfügbar ist.

Es gibt auch einen Link zu [~ # ~] acl [~ # ~] , "einer API für andere Module, um Listen von Benutzern zu erstellen und ihnen Zugriff auf Knoten zu gewähren", aber das an sich ist nur in der Vorabversion für Drupal 8 und ein Modul, das es zu verwenden scheint, Content Access hat offene Sicherheitsprobleme (und befindet sich auch im Vorabversionsstatus ).

Beim Durchsuchen fand ich auch das Modul Berechtigungen nach Begriff , scheint stabil und sehr gut dokumentiert zu sein, aber ich fand es nicht sehr intuitiv, um ehrlich zu sein, und es scheint auch grundsätzlich die Einschränkung der Sicht zu berücksichtigen Zugriff auf Knoten (wie vorgeschlagen hier , aber auch von seinem Video-Tutorial ).

Ich möchte etwas Einfacheres. Und ich möchte natürlich, dass alle Knoten weiterhin für jedermann öffentlich sichtbar sind (natürlich auch für anonyme Benutzer). Obwohl Berechtigungen nach Laufzeit eine mögliche Wahl waren, weiß ich nicht, ob ich sie verwenden kann/sollte.

Es gibt auch das Gruppenmodul , auf das häufig verwiesen wird, aber das scheint auch ein Overkill und viel zu kompliziert für die einfache Aufgabe zu sein, die ich ausführen möchte.

Ich bin ein bisschen verloren in diesem Fall. Es scheint ziemlich einfach zu sein, aber ich kann keinen Weg finden, es zu tun. Jede Hilfe wäre sehr dankbar ...

6
thomas

Es ist lange her, aber ich dachte daran, diese Frage zu beantworten, damit sie für die Leute, die hier landen und nach einer Antwort suchen, vielleicht hilfreicher ist.

Zunächst möchte ich mich bei allen bedanken, die sich die Zeit und Mühe genommen haben, Antworten und Kommentare zu schreiben - als Drupal Neuling selbst, es hilft sehr, diese Art von Feedback von erfahreneren zu haben Benutzer (etwas, das meiner Meinung nach Drupal fehlt ein wenig ..)

Wie ich in meiner Frage erwähnt habe, hatte ich eine sehr ähnliche Frage gefunden, aber ich wollte die Antwort dort nur ungern verwenden, da sie ziemlich alt war und das vorgeschlagene Modul für Drupal 8 (noch in der Beta - und mit diesem Hinweis: "Dieses Modul hat eine Vorabversion für Drupal 8.").

Ich habe mein Problem jedoch mit dem Nodeaccess-Modul gelöst, das in diesem (jetzt 5 Jahre alten) Thread erwähnt wurde - es funktioniert in Ordnung, obwohl es sich noch in der Beta für D8 befindet. Ich habe auf einer Entwicklungssite getestet und sie dann auf der Produktionssite verwendet und sie macht das, was ich will (d. H. - bestimmten, manchmal mehreren Benutzern Bearbeitungszugriff gewähren).

Also lasse ich dies hier nur zum späteren Nachschlagen.

0
thomas

Das Modul Group ist das, worauf Sie achten sollten ... Es ist nicht ° overkill ° (wie in Ihrer Frage), sondern das einzige heute verfügbare D8-Modul mit stabilem Beitrag, das auch Ihre Anforderungen erfüllt.

Für diese spezielle Frage würden Sie das Submodul gnode aktivieren und für jeden Gruppentyp die entsprechenden Berechtigungen (Anzeigen, Bearbeiten, Löschen usw.) für die verschiedenen Inhaltstypen definieren. Eine Beispielkonfiguration finden Sie in meiner Antwort auf " Wie konfiguriere ich den Zugriff auf Kurse für Lehrer und Schüler? ".

Hinweis :

Lassen Sie mich auch (einen Teil) Ihres zusätzlichen Kommentars unter dieser Antwort ansprechen, der so aussieht:

In meinem Fall muss ich einige Gruppen haben - eine für jeden Kurs, der von mehr als einem Lehrer unterrichtet wird.

Wenn ich das Gruppenmodul für Ihren Fall konfigurieren würde, würde ich einen Ansatz wie den folgenden verwenden:

  • Erstellen Sie einen Gruppentyp = Kurse.
  • Erstellen Sie Gruppenrollen = Lehrer und Schüler.
  • Erstellen Sie genau 1 Gruppe für jeden möglichen Kurs mit der Bezeichnung (sagen wir) C1, C2, C3, ....
  • Erteilen Sie nur die Gruppenberechtigung , um einen Knoten des Inhaltstyps "Kurs" für Benutzer zu "bearbeiten", denen der Lehrer "Gruppenrolle" erteilt wurde. Und gemäß Ihrem " Ich möchte, dass alle Knoten weiterhin für jedermann (auch für anonyme Benutzer) öffentlich sichtbar sind" möchten Sie "View" Zugriff auf "Outsiders" und "Anonymous" gewähren, und wahrscheinlich auch an "Studenten".
  • Wenn nur der Lehrer (Benutzer) T1 den Kurs C1 unterrichtet, erhält nur T1 die Gruppenrolle "Lehrer" für (Gruppe) C1.
  • Wenn Lehrer (Benutzer) T2 und T3 Kurs C2 unterrichten, erhalten nur T2 und T3 die Gruppenrolle "Lehrer" für (Gruppe) C2.
  • Wenn Sie Knoten vom Typ "Kurs" erstellen, weisen Sie sie einer (und nur einer) Gruppe zu (also entweder C1, C2 oder C3 oder ...). Und entscheiden Sie, welche Lehrer (Benutzer) Tx der neu erstellte Kurs die Gruppenrolle "Lehrer" erhalten soll.

Erledigt ...

Ressourcen

6
Pierre.Vriens

Wenn Sie einen Inhaltstyp course mit einem Entitätsreferenzfeld field_teachers Haben, können Sie die Bearbeitung für mehrere Benutzer wie folgt aktivieren:

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);
}

Wenn field_teachers nicht auf Benutzer verweist, sondern auf einen anderen Inhaltstyp, wird die UID des Lehrers wahrscheinlich im referenzierten Inhaltstyp gespeichert, und Sie müssen die UID jedes Lehrers von dort abrufen. In diesem Fall fügen Sie alle beteiligten Knoten als zwischenspeicherbare Abhängigkeiten hinzu, sodass das Zugriffsergebnis ungültig wird, wenn der Knoten eines Lehrers mit einer anderen UID geändert wird.

5
4k4

Sie können in das Modul Workbench Access schauen. Auf diese Weise können Sie die Bearbeitungsrechte auf Knoten beschränken, die auf der Menüstruktur oder einer Taxonomie basieren.

Sie können ein Taxonomie-Vokabular für die verschiedenen Editorgruppen erstellen. Beispielbegriffe können Mathematik der 4. Klasse, Naturwissenschaften der 5. Klasse usw. oder auch nur Mathematik, Naturwissenschaften usw. sein. Fügen Sie Ihrem Kursknoten ein Taxonomie-Referenzfeld hinzu, mit dem Sie Ihre Inhalte Ihren Gruppen zuweisen können. Anschließend können Sie Ihre Benutzer (Lehrer) der richtigen Gruppe zuordnen (die nur auf Ihrem Taxonomie-Vokabular basiert), und alle Lehrer in der Gruppe können den Knoten bearbeiten.

Sie können eine Situation implementieren, in der jeder Kurs automatisch einen entsprechenden Taxonomiebegriff erstellt , wenn ein Kursknoten erstellt wird. Sie können dies mit hook_ENTITY_TYPE_insert tun.

So etwas wie das Folgende:

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();
  } 
}

Wenn Sie diese Technik verwenden, müssen Sie nach dem Erstellen eines Kursknotens nur die richtigen Benutzer der Gruppe zuweisen, damit sie ihn bearbeiten können.

[1] Überprüfen Sie, ob ein Begriff vorhanden ist .

[2] Neuen Taxonomiebegriff erstellen

2
sonfd

Eine andere Option, die in einigen D7-Instanzen häufig verwendet wird und wie andere Beiträge nicht vollständig für D8 bereit ist, ist Organic Groups . Auch wenn es für die Hauptsendezeit bereit ist, hat es zwar eine gewisse Lernkurve, kann aber sehr praktisch sein. Ein Anwendungsfall (obwohl immer noch in D7), der Ihren Anforderungen entspricht, ist COD (Conference Organizer Distribution), mit dem Großveranstaltungen wie DrupalCon ausgeführt werden.

Vielleicht möchten Sie sehen, ob es für Sie funktioniert - aber seien Sie gewarnt - einige Lösungsarchitekten, mit denen ich zusammenarbeite, waren mit der D8-Version ziemlich frustriert. Dies ist auf die erheblichen architektonischen Änderungen zwischen D7 und D8 zurückzuführen, kann jedoch in Ihrem Fall funktionieren.

1
karolus