Есть ли способ избежать, чтобы анонимный пользователь мог видеть узел определенного типа контента?

9

Есть ли способ избежать, чтобы анонимные пользователи могли видеть узлы типа контента, такие как блок или представление?

Я могу контролировать доступ с помощью представления, но если я знаю ссылку для узла, я могу увидеть ее без предварительного входа в систему.

Фрэнк Гизеке
источник

Ответы:

10

Вы можете контролировать доступ к узлам в hook_node_access ():

mymodule.module:

use Drupal\node\NodeInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult;

function mymodule_node_access(NodeInterface $node, $op, AccountInterface $account) {
  if ($account->isAnonymous() && $node->gettype() == 'article') {
    return AccessResult::forbidden()->cachePerPermissions();
  }
  return AccessResult::neutral()->cachePerPermissions();
}

Это контролирует прямой доступ к узлу, а не доступ в представлениях. Но это то, что вы, вероятно, хотите.

4k4
источник
Я считаю, что для контроля доступа также вы должны использовать hook_node_grants.
Джонатан
4

Лучше всего использовать Rabbit Hole или Content Access, когда он имеет обновленную версию.

Кроличья нора

Rabbit Hole - это модуль, который добавляет возможность контролировать, что должно происходить, когда объект просматривается на его собственной странице. Возможно, у вас есть тип контента, который никогда не должен отображаться на отдельной странице, например, тип контента изображения, который отображается в карусели. Кроличья нора может помешать этому узлу быть доступным на его собственной странице через узел / xxx.

Доступ к контенту

Этот модуль позволяет вам управлять разрешениями для типов контента по роли и автору. Это позволяет вам определять пользовательский вид, редактировать и удалять разрешения для каждого типа контента. При желании вы можете включить настройки доступа к контенту, чтобы вы могли настроить доступ для каждого узла контента.

Обратите внимание, что я считаю, что вы хотите заблокировать весь доступ к узлу типа контента - и только доступ к контенту выполнит это через Rabbit Hole.

Кроме того, я думаю, что вы бы смотрели на реализацию собственного контроля доступа, если ни один из них не подходит.

Kevin
источник
Извините за вопрос, Кевин, но знакомы ли вы с модулем группы ? Посмотрите видеоурок, чтобы понять, что я имею в виду ... Кстати: для D7 я также рекомендовал "Доступ к контенту".
Pierre.Vriens
2
Нет, так как это был ОГ. Вроде тяжело установить, если в этом нет необходимости?
Кевин
" ... так как это был OG "? Что ты имеешь в виду? А насчет "тяжелого": ты OG (если да, я согласен) или Group (если так, я не согласен)?
Pierre.Vriens
Я всегда просто думал, что группа была форком OG для D8
Кевин
Извините (снова) Кевин, это не так ... читать дальше .
Pierre.Vriens
1

Возможно, вы захотите попробовать использовать модуль Group , который позволяет создавать произвольные коллекции вашего контента и пользователей на вашем сайте, и предоставлять разрешения на управление доступом для этих коллекций. Это доступно с D7, и имеет версию D8 также. Он создает группы как сущности, делая их полностью расширяемыми, расширяемыми и экспортируемыми. К каждой группе могут быть прикреплены пользователи, роли и разрешения (см. « Какие роли поддерживаются модулем группы? », Чтобы узнать об этом подробнее).

Для этого конкретного вопроса вы бы включили gnodeподмодуль, и для каждого типа группы вы должны определить соответствующие разрешения (просмотр, редактирование, удаление и т. Д.) Для различных типов контента.

Похоже, вы хотели бы предоставить доступ к тому, что в группе называется «Участники» и «Аутсайдеры» (= вошли в систему пользователи, которые не являются членами группы). Но вы не разрешаете доступ к «Анонимным» (посетителям сайта, которые не вошли в него).

Ресурсы

Pierre.Vriens
источник
1

Вы можете использовать модуль Node View Permissions .

Включите его, и затем вы сможете назначить роли, которые могут просматривать типы контента, по пути «admin / people / permissions» в разделе «Права доступа к узлам».


источник