Posiadanie widoków uwzględnia szacunek dostępu do węzła

14

Używam, hook_node_access()aby odmówić użytkownikom dostępu do niektórych węzłów na podstawie niestandardowych kryteriów. Nie chcę jednak, aby ta treść była wyświetlana w widoku z listą, jeśli użytkownik nie spełni kryteriów. Czy istnieje sposób, aby poglądy szanowały hook_node_access()wdrożenia?

nenne
źródło
Jeśli moduł Widoki tak naprawdę nie przestrzega zestawu uprawnień dostępu hook_node_access(), należy zrobić tylko jedną rzecz: zmienić kod modułu Widoki.
kiamlaluno
Nie sądzę, że hak jest uruchamiany, dopóki węzeł nie zostanie w całości załadowany przez node_load, więc prawdopodobnie dlatego nadal się pojawia. Zacząłem jednak pracować nad wtyczką filtrującą, która użyje tej samej metody filtrowania, której używa implementacja hook_node_access () do blokowania ludzi. Muszę tylko pamiętać, aby dodać ten filtr do wszystkich moich widoków i powinien on działać. Wrócę tutaj z informacjami na ten temat, gdy skończę, aby inni mogli skorzystać.
nenne
Ok, więc mój przypadek użycia był następujący: Klient chce mieć 10 poziomów dostępu dla każdego węzła, a użytkownicy powinni widzieć wszystkie węzły poniżej ich poziomu dostępu. Można to łatwo rozwiązać za pomocą hook_node_access dla standardowego widoku węzła. Ponieważ jednak widoki tego nie szanowały, stworzyłem filtr kontekstowy z niestandardowym kodem php dla argumentu. Kod php zasadniczo zwrócił niższe lub równe wartości dla poziomu dostępu użytkowników (w odpowiedniej składni oddzielonej przez,). Wadą tego rozwiązania jest to, że każdy widok będzie wymagał takiej konfiguracji.
nie
Znalazłem problem z widokami, który dotyczy tego problemu, odnosi się również do właściwego sposobu rozwiązania problemu: drupal.org/node/1266388 .
nie
2
Jeśli potrafisz napisać odpowiedź na temat rozwiązania problemu, jest to całkowicie do przyjęcia; jak mówi merlinofchaos, moduł Widoki ładuje węzły za pomocą zapytania do bazy danych i to jest powód, dla którego hook_node_access()implementacje nie są przestrzegane. Ponieważ jest to „z założenia”, zgłaszanie obejścia jest w porządku.
kiamlaluno

Odpowiedzi:

6

Miałem to samo pytanie jakiś czas temu tutaj .

hook_node_accessnie jest rozpoznawany przez viewslub menus. Powinien być używany tylko jako ostatnia linia obrony.

Lepszym sposobem kontroli dostępu do węzła jest hook_node_access_recordsi hook_node_grantsjak opisano tutaj i tutaj .

Baba
źródło
1

Widoki wykorzystują SQL do określania węzłów do wyświetlenia. Niestety, ze względu na wydajność, po prostu nie byłoby możliwe, aby Drupal wykonał obciążenie węzła na wszystkich potencjalnych kandydatach, a następnie wywołał dostęp hook_node na każdym z nich. Wyobraź sobie widok, który pokazuje tysiące węzłów (szczególnie podczas korzystania z pagera). Jeśli logika nie jest wykonywana w SQL, pagery miałyby bardzo nietypową funkcjonalność, dlatego Drupal zmusza cię do zrobienia tego, jak wspomniano rik przy użyciu rekordów dostępu w bazie danych.

Wykonanie access_records to o wiele więcej pracy, ale sprawi, że będzie działać z SQL. Dlatego zalecam użycie istniejącego modułu node_access do rozwiązania twojej funkcjonalności tam, gdzie to możliwe, ponieważ prawdopodobnie zostanie ona zaimplementowana przy użyciu rekordów dostępu, a zatem będzie działać z widokami.

Nawiasem mówiąc, rekordy dostępu są przechowywane w tabeli node_access, jak pokazano poniżej: wprowadź opis zdjęcia tutaj Poprzez komentarze do każdej kolumny można zrozumieć ich przeznaczenie. Pomyśl o królestwie jako o systemie używanym do dostępu do węzła, a gid jako o grupie w królestwie. Ta grupa może mieć uprawnienia do przeglądania, aktualizowania i usuwania. Zasadniczo każdy moduł node_access definiuje jedną lub więcej dziedzin (czasami wiele modułów node_access może również pracować równolegle). Użytkownik ma jedną lub więcej kategorii w każdej dziedzinie.

W Drupal do wszystkich zapytań, które mają znacznik „node_access” automatycznie dodana zostanie specjalna logika. Zobacz dokumentację, aby dowiedzieć się więcej o tagowaniu. Ta specjalna logika dołącza do tabeli „node_access” dla każdej dziedziny i dodaje warunek, że gdy „gid” jest równy jednej z linii zastosowanych do użytkownika, użytkownik ma odpowiednie uprawnienia.

Cały ten system pozwala wszystkim zapytaniom poprawnie obsługiwać dostęp do węzła, nawet zliczać zapytania itp. Jest bardzo wydajny, ale ma wyższą krzywą uczenia się niż tylko prosty hook_node_access. O ile to możliwe, użycie istniejącego modułu node_access może zaoszczędzić ci całego bólu głowy.

Thomas4019
źródło