Le visualizzazioni hanno rispetto hook_node_access


14

Sto usando hook_node_access()per negare agli utenti l'accesso ad alcuni nodi in base a criteri personalizzati. Tuttavia, non desidero che questo contenuto venga visualizzato in una vista che lo elenca se l'utente non supera i criteri. C'è un modo per avere punti di vista rispetto alle hook_node_access()implementazioni?


Se il modulo Views non rispetta realmente le autorizzazioni di accesso impostate hook_node_access(), c'è solo una cosa da fare: modificare il codice del modulo Views.
kiamlaluno

Non penso che l'hook venga attivato fino a quando il nodo non viene effettivamente caricato nella sua interezza con node_load, quindi è probabilmente il motivo per cui viene ancora visualizzato. Ho comunque iniziato a lavorare su un plug-in di filtro che utilizzerà lo stesso metodo di filtro utilizzato dall'implementazione di hook_node_access () per bloccare le persone. Dovrò solo ricordare di aggiungere quel filtro in tutte le mie viste e dovrebbe funzionare. Tornerò qui con le informazioni su di esso una volta che ho finito in modo che gli altri possano beneficiare.
nenne,

Ok, quindi il mio caso d'uso è stato questo: il cliente desidera applicare 10 livelli di accesso per qualsiasi nodo e gli utenti dovrebbero essere in grado di vedere tutti i nodi al di sotto del loro livello di accesso. Ciò è stato facilmente risolto tramite hook_node_access per la vista nodo standard. Tuttavia, poiché le viste non lo rispettavano, ho creato un filtro contestuale con codice php personalizzato per l'argomento. Il codice php ha sostanzialmente restituito i valori inferiori o uguali per il livello di accesso degli utenti (nella sintassi corretta separata da,). Lo svantaggio di questa soluzione è che ogni vista avrà bisogno di questa configurazione.
nenne,

Ho trovato un problema per le visualizzazioni che si occupano di questo problema, si riferisce anche a un modo corretto di risolvere il problema: drupal.org/node/1266388 .
nenne,

2
Se riesci a scrivere una risposta su come risolvere il problema, è perfettamente accettabile; come dice merlinofchaos, il modulo Views sta caricando i nodi usando una query del database, e questo è il motivo per cui le hook_node_access()implementazioni non sono rispettate. Poiché è "in base alla progettazione", la segnalazione di una soluzione alternativa va bene.
kiamlaluno

Risposte:


6

Ho avuto la stessa domanda qualche tempo fa qui .

hook_node_accessnon è riconosciuto da viewso menus. Dovrebbe essere usato solo come ultima linea di difesa.

Un modo migliore per controllare l'accesso ai nodi è attraverso hook_node_access_recordse hook_node_grantscome descritto qui e qui .



1

Views utilizza SQL per determinare i nodi da visualizzare. Purtroppo, per motivi di performance, Drupal non sarebbe semplicemente possibile eseguire un nodo_carico su tutti i potenziali candidati e quindi chiamare hook_node_access su ognuno di quelli. Immagina una vista che mostri migliaia di nodi (specialmente quando usi un cercapersone). Se la logica non viene eseguita in SQL, i cercapersone avrebbero funzionalità molto insolite, quindi Drupal ti costringe a farlo come rik menzionato usando i record di accesso nel tuo database.

Rendere access_records è un bel po 'più di lavoro ma lo farà funzionare con SQL. Pertanto, consiglio di utilizzare un modulo node_access esistente per risolvere la tua funzionalità laddove possibile perché probabilmente sarà implementato usando i record di accesso e quindi funzionerà con le viste.

A proposito, i record di accesso sono archiviati nella tabella node_access come mostrato di seguito: inserisci qui la descrizione dell'immagine Attraverso i commenti per ogni colonna è possibile comprendere il loro scopo. Pensa al regno come al sistema usato per l'accesso al nodo e al gid come al gruppo all'interno di un regno. Quel gruppo può avere autorizzazioni di visualizzazione, aggiornamento ed eliminazione. In generale ogni modulo node_access definisce uno o più realm (a volte anche più moduli node_access possono funzionare in parallelo). Un utente ha una o più gid in ciascuno dei regni.

In Drupal tutte le query che hanno il tag "node_access" avranno automaticamente aggiunto una logica speciale. Vedi la documentazione per ulteriori informazioni sulla codifica. Questa logica speciale unisce la tabella "node_access" per ogni realm e aggiunge la condizione che laddove "gid" è uguale a una delle gid applicate a un utente, l'utente disponga dell'autorizzazione appropriata.

L'intero sistema consente a tutte le query di gestire correttamente node_access, anche di contare le query, ecc. È molto potente ma ha una curva di apprendimento più elevata rispetto al semplice hook_node_access. Quando possibile, l'uso di un modulo node_access esistente può farti risparmiare tutto questo mal di testa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.