it-swarm.com.de

Ansichten respektieren hook_node_access

Ich verwende hook_node_access(), um Benutzern den Zugriff auf einige Knoten basierend auf benutzerdefinierten Kriterien zu verweigern. Ich möchte jedoch nicht, dass dieser Inhalt in einer Ansicht angezeigt wird, in der er aufgelistet ist, wenn der Benutzer die Kriterien nicht erfüllt. Gibt es eine Möglichkeit, dass Ansichten hook_node_access() Implementierungen respektieren?

14
nenne

Ich hatte vor einiger Zeit die gleiche Frage hier .

hook_node_access wird von views oder menus nicht erkannt. Es sollte nur als letzte Verteidigungslinie verwendet werden.

Eine bessere Möglichkeit, den Knotenzugriff zu steuern, ist hook_node_access_records und hook_node_grants wie beschrieben hier und hier .

6
Baba

hook_node_access () wird nur aufgerufen, wenn versucht wird, den vollständigen Knoten anzuzeigen. Sie müssen hook_node_access_records () und hook_node_grants () implementieren.

4
rik

Views verwendet SQL, um die anzuzeigenden Knoten zu bestimmen. Leider wäre es aus Leistungsgründen für Drupal einfach nicht möglich, eine Knotenladung für alle potenziellen Kandidaten durchzuführen und dann für jeden von ihnen hook_node_access aufzurufen. Stellen Sie sich eine Ansicht vor, die Tausende von Knoten zeigt (insbesondere bei Verwendung eines Pagers). Wenn die Logik nicht in SQL ausgeführt wird, haben die Pager eine sehr ungewöhnliche Funktion, sodass Drupal Sie dazu zwingt, dies wie unter Verwendung von Zugriffsdatensätzen in Ihrer Datenbank erwähnt zu tun.

Access_records zu erstellen ist eine Menge mehr Arbeit, wird aber mit SQL funktionieren. Daher empfehle ich, ein vorhandenes node_access-Modul zu verwenden, um Ihre Funktionalität nach Möglichkeit zu lösen, da es wahrscheinlich mithilfe von Zugriffsdatensätzen implementiert wird und daher mit Ansichten funktioniert.

Übrigens werden die Zugriffsdatensätze in der Tabelle node_access gespeichert, wie unten dargestellt: enter image description here Durch die Kommentare für jede Spalte können Sie einen Überblick über deren Zweck erhalten. Stellen Sie sich den Realm als das System vor, das für den Knotenzugriff verwendet wird, und die GID als die Gruppe innerhalb eines Realms. Diese Gruppe kann Berechtigungen zum Anzeigen, Aktualisieren und Löschen haben. Im Allgemeinen definiert jedes node_access-Modul einen oder mehrere Bereiche (manchmal können auch mehrere node_access-Module parallel arbeiten). Ein Benutzer hat in jedem Bereich ein oder mehrere Gids.

In Drupal wird allen Abfragen mit dem Tag "node_access" automatisch eine spezielle Logik hinzugefügt. Weitere Informationen zum Taggen finden Sie in Dokumentation . Diese spezielle Logik verbindet die Tabelle "node_access" für jeden Bereich und fügt die Bedingung hinzu, dass der Benutzer über die entsprechende Berechtigung verfügt, wenn die "gid" einer der auf einen Benutzer angewendeten gids entspricht.

Dieses ganze System ermöglicht es allen Abfragen, node_access richtig zu verarbeiten, sogar Abfragen zu zählen usw. Es ist sehr leistungsfähig, hat aber eine höhere Lernkurve als nur der einfache hook_node_access. Wenn immer möglich, können Sie durch die Verwendung eines vorhandenen node_access-Moduls diese ganzen Kopfschmerzen sparen.

1
Thomas4019