Имея взгляды уважать hook_node_access

14

Я использую, hook_node_access()чтобы запретить пользователям доступ к некоторым узлам на основе пользовательских критериев. Однако я не хочу, чтобы это содержимое отображалось в представлении, в котором он отображается, если пользователь не соответствует критериям. Есть ли способ заставить представления уважать hook_node_access()реализации?

nenne
источник
Если модуль Views на самом деле не уважает права доступа, установленные с hook_node_access()помощью, то нужно просто сделать следующее: изменить код модуля Views.
kiamlaluno
Я не думаю, что ловушка запускается до тех пор, пока узел фактически не будет загружен полностью с помощью node_load, поэтому, вероятно, он все еще появляется. Однако я начал работать над плагином фильтра, который будет использовать тот же метод фильтрации, который использует реализация hook_node_access () для блокировки людей. Мне просто нужно не забыть добавить этот фильтр во все мои представления, и он должен работать. Я вернусь сюда с информацией об этом, как только я закончу, чтобы другие могли выиграть.
Ненне
Итак, мой пример использования был следующий: клиент хочет, чтобы для любого узла было применимо 10 уровней доступа, и пользователи должны видеть все узлы ниже своего уровня доступа. Это было легко решено через hook_node_access для стандартного представления узла. Однако, поскольку представления не уважали это, я создал контекстный фильтр с пользовательским кодом php для аргумента. Код php в основном возвращал значения ниже или равные для уровня доступа пользователей (в правильном синтаксисе, разделенном,). Недостаток этого решения заключается в том, что каждому представлению потребуется эта конфигурация.
nenne
Я нашел проблему для представлений, которая имеет дело с этой проблемой, это также относится к правильному способу решения проблемы: drupal.org/node/1266388 .
Ненн
2
Если вы можете написать ответ о том, как решить проблему, это вполне приемлемо; как говорит merlinofchaos, модуль Views загружает узлы с помощью запроса к базе данных, и именно поэтому hook_node_access()реализации не соблюдаются. Так как это «по замыслу», отчетность об обходных путях - это хорошо.
kiamlaluno

Ответы:

6

У меня был тот же вопрос некоторое время назад здесь .

hook_node_accessне распознается viewsили menus. Он должен использоваться только в качестве последней линии защиты.

Лучший способ управления доступом к узлу - сквозной hook_node_access_recordsи hook_node_grantsописанный здесь и здесь .

ромовая баба
источник
1

Представления используют SQL для определения узлов для отображения. К сожалению, из соображений производительности Drupal просто не сможет выполнить node_load для всех потенциальных кандидатов, а затем вызвать hook_node_access для каждого из них. Представьте себе представление, которое показывает тысячи узлов (особенно при использовании пейджера). Если логика не реализована в SQL, то пейджеры будут иметь очень необычную функциональность, поэтому Drupal заставляет вас делать это, как упоминалось ранее, используя записи доступа в вашей базе данных.

Создание access_records довольно много работы, но заставит его работать с SQL. Поэтому я рекомендую использовать существующий модуль node_access для решения вашей функциональности везде, где это возможно, потому что он, вероятно, будет реализован с использованием записей доступа и, следовательно, будет работать с представлениями.

Между прочим, записи доступа хранятся в таблице node_access таблицы, как показано ниже: введите описание изображения здесь Посредством комментариев для каждого столбца вы можете получить представление об их назначении. Представьте, что сфера - это система, используемая для доступа к узлам, а гид - как группа внутри области. Эта группа может иметь права просмотра, обновления и удаления. В общем, каждый модуль node_access определяет одну или несколько областей (иногда несколько модулей node_access также могут работать параллельно). У пользователя есть один или несколько гидов в каждой из областей.

В Drupal все запросы, имеющие тег «node_access», автоматически будут иметь некоторую специальную логику. См. Документацию, чтобы узнать больше о маркировке. Эта специальная логика объединяет таблицу «node_access» для каждой области и добавляет условие, что, когда «gid» равен одному из gid, примененных к пользователю, пользователь имеет соответствующие разрешения.

Вся эта система позволяет всем запросам правильно обрабатывать node_access, даже считать запросы и т. Д. Она очень мощная, но имеет более высокую кривую обучения, чем просто hook_node_access. Когда это возможно, использование существующего модуля node_access может избавить вас от всей этой головной боли.

Thomas4019
источник