Aufrufe respektieren hook_node_access

14

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, die ihn auflistet, wenn der Benutzer die Kriterien nicht erfüllt. Gibt es eine Möglichkeit, Ansichten bezüglich hook_node_access()Implementierungen zu haben ?

nenne
quelle
Wenn das Modul "Ansichten" die Zugriffsberechtigung, mit der hook_node_access()es festgelegt wurde , nicht wirklich einhält, sollten Sie nur Folgendes tun: den Code des Moduls "Ansichten" ändern.
kiamlaluno
Ich glaube nicht, dass der Hook ausgelöst wird, bis der Knoten tatsächlich vollständig mit node_load geladen ist. Deshalb wird er wahrscheinlich immer noch angezeigt. Ich habe jedoch angefangen, an einem Filter-Plugin zu arbeiten, das dieselbe Methode zum Filtern verwendet, die die Implementierung von hook_node_access () zum Aussperren von Personen verwendet. Ich muss nur daran denken, diesen Filter in all meinen Ansichten hinzuzufügen, und er sollte funktionieren. Ich werde mit Informationen zurückkommen, sobald ich fertig bin, damit andere davon profitieren können.
Nenne
Ok, mein Anwendungsfall war also: Der Kunde möchte, dass 10 Zugriffsebenen für jeden Knoten gelten und die Benutzer alle Knoten unter ihrer Zugriffsebene sehen können. Dies wurde einfach über hook_node_access für die Standardknotenansicht gelöst. Da dies jedoch nicht beachtet wurde, habe ich einen Kontextfilter mit benutzerdefiniertem PHP-Code für das Argument erstellt. Der PHP-Code hat im Grunde genommen den niedrigeren oder den gleichen Wert für die Zugriffsebene des Benutzers zurückgegeben (in der richtigen Syntax, getrennt durch,). Der Nachteil dieser Lösung ist, dass jede Ansicht diese Konfiguration benötigt.
Nenne
Ich habe ein Problem für Ansichten gefunden, die sich mit diesem Problem befassen . Es bezieht sich auch auf eine ordnungsgemäße Lösung des Problems: drupal.org/node/1266388 .
Nenne
2
Wenn Sie eine Antwort zur Behebung des Problems schreiben können, ist dies durchaus akzeptabel. Wie Merlinofchaos sagt, lädt das Modul "Ansichten" die Knoten mithilfe einer Datenbankabfrage. Dies ist der Grund, warum hook_node_access()Implementierungen nicht beachtet werden. Das Melden einer Problemumgehung ist "von vornherein" in Ordnung.
kiamlaluno

Antworten:

6

Ich hatte die gleiche Frage vor einiger Zeit hier .

hook_node_accesswird von viewsoder nicht erkannt menus. Es sollte nur als letzte Verteidigungslinie verwendet werden.

Eine bessere Möglichkeit zu Steuerknoten Zugriff ist durch hook_node_access_recordsund hook_node_grantswie hier und hier .

Baba
quelle
1

Views verwendet SQL, um die anzuzeigenden Knoten zu bestimmen. Leider wäre es aus Performance-Gründen für Drupal einfach nicht machbar, eine node_load für alle potenziellen Kandidaten durchzuführen und dann hook_node_access für jeden dieser Kandidaten 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, weisen die Pager eine sehr ungewöhnliche Funktionalität auf. Drupal erzwingt daher, dass Sie dies tun, wie von rik erwähnt, indem Sie Zugriffsdatensätze in Ihrer Datenbank verwenden.

Das Erstellen von access_records ist einiges aufwändiger, 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 (siehe unten): Bildbeschreibung hier eingeben Durch die Kommentare für jede Spalte erhalten Sie einen Überblick über deren Zweck. Stellen Sie sich den Bereich als das System vor, das für den Knotenzugriff verwendet wird, und die GID als die Gruppe innerhalb eines Bereichs. Diese Gruppe kann über Berechtigungen zum Anzeigen, Aktualisieren und Löschen verfügen. 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 werden allen Abfragen mit dem Tag "node_access" automatisch spezielle Logikfunktionen hinzugefügt. Weitere Informationen zum Taggen finden Sie in der Dokumentation . Diese spezielle Logik verknüpft die Tabelle "node_access" für jeden Bereich und fügt die Bedingung hinzu, dass der Benutzer über die entsprechende Berechtigung verfügt, wenn "gid" einer der auf einen Benutzer angewendeten Gids entspricht.

Dieses gesamte System ermöglicht es allen Abfragen, node_access ordnungsgemäß zu verarbeiten, sogar Abfragen zu zählen usw. Es ist sehr leistungsfähig, weist jedoch eine höhere Lernkurve auf als nur hook_node_access. Wenn immer möglich, können Sie durch die Verwendung eines vorhandenen node_access-Moduls diesen ganzen Kopfschmerz sparen.

Thomas4019
quelle