Ограничить, какие роли могут просматривать узел на основе его типа контента


18

Я использую Drupal 7, и я создал новый тип контента под названием «электронная книга», и я создал новую роль под названием «MonthlySubscriber». Я хочу, чтобы только пользователи с «MonthlySubscriber» могли просматривать узлы «eBook». Когда я посмотрел на параметры разрешений для роли, я увидел флажки, которые позволяют создавать, редактировать и удалять узлы этого типа контента, но флажки для просмотра узлов отсутствуют.

Как ограничить пользователей, которые могут просматривать узлы «eBook», только пользователями с ролью «MonthlySubscriber»?

Ответы:


13

Вам необходимо установить модуль Content Access, чтобы добавить этот контроль доступа.

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


5

Для drupal 7 попробуйте использовать hook_node_access () :

/**
 * Implements hook_node_access().
 */
function YOURMODULE_node_access($node, $op, $account) {
  if (
    $node->type == 'ebook' &&
    $op == 'view' &&
    !in_array('MonthlySubscriber', $account->roles)
  ) { return NODE_ACCESS_DENY; }
  return NODE_ACCESS_IGNORE;
}

1
Пожалуйста, избегайте ответов только по коду. Они не служат учебной цели. По крайней мере, объяснить в предложении или три, как именно этот конкретный код является ответом? Как это работает? почему это работает? Тип описания, который поможет другим написать похожий код в подобной ситуации, вместо того, чтобы спрашивать снова и снова.
Молот

Это должен быть правильный ответ.
GrafiCode

5

Вот простой способ защитить страницы узла (узел / NID) от непривилегированных пользователей.

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  $items['node/%node']['access callback'] = 'mymodule_check_node_access';
}

/**
 * Determines whether the current user may perform the operation on the node.
 */
function mymodule_check_node_access($op, $node) {
  if ($node->type == 'protected_type' && !user_access('administer site configuration')) {
    return FALSE;
  }
  return node_access($op, $node);
}

2
Обратите внимание, что использование hook_node_accessне будет работать с чем-либо, что «перечисляет» узлы, например, с представлением. Таким образом, вы можете ограничить доступ к представлению hook_node_access, но запрос View или пользовательский узел может по-прежнему показывать этот узел пользователю. hook_node_accessболее полезен для редакционного контроля, для управления операциями создания / обновления / удаления
Брайан

Ваш код не работает для меня, но вы указали мне в правильном направлении. Я нашел рабочий код в документации по hook_node_access api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo

Это плохой пример, потому что он использует mymodule_node_access в качестве пользовательской функции, в то время как Drupal предоставляет хук hook_node_access. Это может запутать.
Batigolix

@batigolix, как указано в ответе, это способ защитить страницы узлов, а не узлов.
я.тек


1

Для Drupal 7 попробуйте это: Доступ по сроку

Обеспечивает очень гибкое иерархическое управление доступом к узлу (контроль доступа к контенту) для D7.


0

Решение hook_menu_alter, опубликованное выше ya.teck, действительно работает, но конфликтует со стандартным hook_node_access в его имени функции. hook_menu_alter в этом случае не требуется, и поэтому ответ, опубликованный Денисом выше, на мой взгляд, более точный и правильный. Изменение menu_item, как это делается, - это первый ссылочный пример, который может быть перенесен другим модулем дальше по трубе.


0

Я использовал фрагмент кода, найденный в документации API- интерфейса D7 для ловушки hook_node_access .

Этот код предоставит доступ к просмотру содержимого "электронных книг" пользователям, которые имеют разрешение на "просмотр электронных книг".

Вам нужно новое разрешение для управления доступом, реализуя hook_permission ().

/**
 * Implements hook_permission().
 */
function mymodule_permission() {
  return array(
    'view ebook' => array(
      'title' => t('View Ebook'),
      'description' => t('View Ebook nodes.'),
    ),
  );
}

Благодаря реализации hook_node_access () Drupal может предоставить или запретить доступ к узлу.

/**
 * Implements hook_node_access().
 */
function mymodule_node_access($node, $op, $account) {

  // Checks for an ebook node in view mode.
  if (is_object($node) && $node->type === 'ebook' && $op === 'view') {

    // Grants permission to view the node if the current user has an role
    // with the permission 'view ebook'.
    if (user_access('view ebook')) {
      return NODE_ACCESS_ALLOW;
    }

    // Otherwise disallows access to view the node.
    return NODE_ACCESS_DENY;
  }
  // For all other nodes and other view modes, don't affect the access.
  return NODE_ACCESS_IGNORE;
}

С другими разрешениями (редактировать, удалять и т. Д.) Можно обращаться через обычные разрешения Drupal.

При желании вы можете удалить контент из обзора администратора, реализовав hook_query_TAG_NAME_alter.

/**
 * Implements hook_query_TAG_NAME_alter().
 */
function mymodule_query_node_admin_filter_alter(QueryAlterableInterface $query) {
  if (!user_access('view ebook')) {
  $query->condition('n.type', 'ebook', '!=');
  }
}

0

Я предпочитаю использовать модуль Node View Permissions . Это проще, чем модуль Content Access.

Как и в D6, он добавляет разрешения «Просмотр любого контента» и «Просмотр собственного контента» для любого типа контента, который вы выберете.

введите описание изображения здесь

Шаги, чтобы следовать:

  1. После установки и включения перейдите /admin/config/content/node-view-permissionsи выберите типы контента, доступ к которым вы хотите ограничить.
  2. Затем перейдите /admin/people/permissions#module-node_view_permissions и выберите роли, которые вы хотите просматривать. Сохранить разрешения.

    Выполнено!


для drupal 8 «Разрешения на просмотр узлов» не работает
Karthikeyan Manivasagam

@KarthikeyanManivasagam Как так?
Крис Хэппи

Мы использовали этот модуль в одном из наших проектов, где нам нужно предоставить доступ к просмотру контента на основе роли и типа контента, но он вообще не работает. он ведет себя так же, как и без использования этого модуля.
Картикеян Манивасагам
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.