Tener vistas respecto hook_node_access

14

Estoy utilizando hook_node_access()para denegar a los usuarios el acceso a algunos nodos según un criterio personalizado. Sin embargo, no quiero que este contenido aparezca en una vista que lo enumere si el usuario no pasa los criterios. ¿Hay alguna forma de que las vistas respeten las hook_node_access()implementaciones?

nenne
fuente
Si el módulo de Vistas realmente no respeta el conjunto de permisos de acceso hook_node_access(), solo hay una cosa que debe hacerse: alterar el código del módulo de Vistas.
kiamlaluno
No creo que ese gancho se active hasta que el nodo se cargue en su totalidad con node_load, por lo que probablemente sea por eso que todavía aparece. Sin embargo, he comenzado a trabajar en un complemento de filtro que usará el mismo método de filtrado que la implementación de hook_node_access () usa para bloquear a las personas. Solo tendré que recordar agregar ese filtro en todas mis vistas y debería funcionar. Volveré aquí con información una vez que haya terminado para que otros puedan beneficiarse.
nenne
Ok, mi caso de uso fue este: el cliente quiere 10 niveles de acceso aplicables a cualquier nodo y los usuarios deberían poder ver todos los nodos debajo de su nivel de acceso. Esto se resolvió fácilmente a través de hook_node_access para la vista de nodo estándar. Sin embargo, como las vistas no respetaban esto, creé un filtro contextual con un código php personalizado para el argumento. El código php devolvió básicamente los valores inferiores o iguales para el nivel de acceso de los usuarios (en una sintaxis adecuada separada por,). El inconveniente de esta solución es que cada vista necesitará esta configuración.
nenne
Encontré un problema para las vistas que trata este problema, también se refiere a una forma adecuada de resolver el problema: drupal.org/node/1266388 .
nenne
2
Si puede escribir una respuesta sobre cómo resolver el problema, eso es perfectamente aceptable; Como dice Merlinofchaos, el módulo Vistas está cargando los nodos utilizando una consulta de base de datos, y esa es la razón por la cual hook_node_access()no se respetan las implementaciones. Como es "por diseño", informar una solución alternativa está bien.
kiamlaluno

Respuestas:

6

Tuve la misma pregunta hace un tiempo aquí .

hook_node_accessno es reconocido por viewso menus. Solo debe usarse como la última línea de defensa.

Una mejor manera de controlar el acceso a los nodos es mediante hook_node_access_recordsy hook_node_grantscomo se describe aquí y aquí .

Baba
fuente
1

Las vistas usan SQL para determinar los nodos a mostrar. Lamentablemente, por razones de rendimiento, simplemente no sería factible que Drupal realice una carga de nodo en todos los candidatos potenciales y luego llame a hook_node_access en cada uno de ellos. Imagine una vista que muestra miles de nodos (especialmente cuando se usa un buscapersonas). Si la lógica no se realiza en SQL, entonces los buscapersonas tendrían una funcionalidad muy inusual, por lo que Drupal lo obliga a hacerlo como se menciona utilizando los registros de acceso en su base de datos.

Hacer que access_records sea mucho más trabajo pero hará que funcione con SQL. Por lo tanto, recomiendo usar un módulo node_access existente para resolver su funcionalidad siempre que sea posible porque probablemente se implementará utilizando registros de acceso y, por lo tanto, funcionará con vistas.

Por cierto, los registros de acceso se almacenan en la tabla tabla_acceso_nodo como se ve a continuación: a ingrese la descripción de la imagen aquí través de los comentarios para cada columna, puede comprender su propósito. Piense en el reino como el sistema utilizado para el acceso a los nodos y el gid como el grupo dentro de un reino. Ese grupo puede tener permisos para ver, actualizar y eliminar. En general, cada módulo node_access define uno o más reinos (a veces, varios módulos node_access también pueden funcionar en paralelo). Un usuario tiene uno o más gids en cada uno de los reinos.

En Drupal, todas las consultas que tengan la etiqueta "node_access" tendrán automáticamente alguna lógica especial agregada. Consulte la documentación para obtener más información sobre el etiquetado. Esta lógica especial se une a la tabla "node_access" para cada reino y agrega la condición de que donde el "gid" es igual a uno de los gid aplicados a un usuario, el usuario tiene el permiso apropiado.

Todo este sistema permite que todas las consultas manejen correctamente el nodo_acceso, incluso contar consultas, etc. Es muy potente pero tiene una curva de aprendizaje más alta que el simple hook_node_access. Siempre que sea posible, usar un módulo node_access existente puede ahorrarle todo este dolor de cabeza.

Thomas4019
fuente