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

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

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

19 голосов | спросил John 14 J000000Thursday11 2011, 19:44:19

8 ответов


13

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

  

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

ответил iStryker 14 J000000Thursday11 2011, 19:52:29
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;
}
ответил Denis 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 17 Sep 2015 09:05:53 +0300 2015, 09:05:53
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);
}
ответил ya.teck 18 FebruaryEurope/MoscowbTue, 18 Feb 2014 09:16:46 +0400000000amTue, 18 Feb 2014 09:16:46 +040014 2014, 09:16:46
2

Доступ к контенту не работал для моей установки Drupal 7, поэтому я вместо этого использовал Разрешения просмотра узла .

ответил Sam King 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 11 Sep 2012 23:56:57 +0400 2012, 23:56:57
1

Для drupal 7 попробуйте следующее: Доступ по сроку

  

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

ответил washooo 6 PM00000060000005431 2011, 18:36:54
0

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

ответил ben.hamelin 13 J000000Wednesday16 2016, 06:22:02
0

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

Этот код предоставит доступ для просмотра содержимого «ebook» для пользователей, имеющих разрешение «просматривать электронную книгу».

Вам нужно новое разрешение для контроля доступа путем реализации 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', '!=');
  }
}
ответил batigolix 1 J0000006Europe/Moscow 2017, 15:17:22
0

Я перейду с помощью модуля разрешений узла . Это проще, чем модуль Content Access.

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

 введите описание изображения здесь>> </a> </p>

<p> Этапы: </p>

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

<p> Готово! </p>
</li>
</ol></body></html>

ответил Chris Happy 16 AM00000010000004131 2017, 01:44:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132