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


18

Я використовую Drupal 7 і створив новий тип вмісту під назвою "eBook", і створив нову роль під назвою "MonthlySubscriber". Я маю намір дозволити лише користувачам, які мають "MonthlySubscribe", переглядати вузли "eBook". Переглянувши налаштування дозволу на роль, я побачив прапорці, які дозволяють створювати, редагувати та видаляти вузли цього типу вмісту, але немає перелікових пунктів для перегляду вузлів.

Як обмежити користувачів, які можуть переглядати вузли "електронної книги", лише тих користувачів, які виконують роль "MonthlySubscriber"?

Відповіді:


13

Вам потрібно встановити модуль доступу до вмісту, щоб додати цей контроль доступу.

Цей модуль дозволяє керувати дозволами для типів вмісту за роллю та автором. Це дозволяє вказати власні перегляд, редагувати та видаляти дозволи для кожного типу вмісту.


5

Для drupal 7, спробуйте скористатись пунктом____код () :

/**
 * 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не працюватиме з тим, що "перераховує" вузли, як, наприклад, View. Таким чином, ви можете обмежити доступ до перегляду hook_node_access, але запит перегляду чи користувальницького вузла все ще може показувати цей вузол користувачеві. hook_node_accessкорисніше для редакційного контролю, для керування операціями створення / оновлення / видалення
Брайан

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

Це поганий приклад, оскільки він використовує mymodule_node_access як спеціальну функцію, в той час як Drupal надає гачок_node_access. Це може стати заплутаним.
batigolix

@batigolix, як зазначено у відповіді, це спосіб захистити сторінки вузлів, а не вузли.
ya.teck


1

Для drupal 7 спробуйте це: Доступ за терміном

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


0

Рішення kuk_menu_alter, розміщене вище ya.teck, працює, але суперечить стандартній назві_на_контакту у його назві функції. гак_мену_алтер в цьому випадку не потрібен, і тому відповідь, розміщена Денисом вище, на мій погляд, є більш точною та правильною. Змінюючи menu_item, як це робиться, це перший посилається приклад, який може бути замінено іншим модулем далі вниз по трубі.


0

Я використав фрагмент коду, знайдений в документації api D7 для гака гачок_node_access .

Цей код надасть доступ до перегляду вмісту "електронної книги" користувачам, які мають дозвіл "переглянути електронну книгу".

Вам потрібен новий дозвіл на управління доступом, реалізуючи прив'язку_контроля ().

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

Реалізуючи прив'язку__код_вступ (), 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.

За бажанням ви можете видалити вміст із огляду адміністратора, застосувавши крючок_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

Я маю на увазі використання модуля дозволів перегляду вузла . Це простіше, ніж модуль доступу до вмісту.

Як і в D6, він додає дозволи "Переглянути будь-який вміст" та "Переглянути власний вміст" до будь-якого вибраного вами типу вмісту.

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

Кроки для виконання:

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

    Готово!


для drupal 8 "Дозвіл на перегляд вузла" не працює
Karthikeyan Manivasagam

@KarthikeyanManivasagam Як так?
Chris Happy

Цей модуль ми використовували в одному з наших проектів, де нам потрібно забезпечити доступ до перегляду вмісту на основі ролі та типу вмісту, але він взагалі не працює. вона поводиться так само, як і без використання цього модуля.
Karthikeyan Manivasagam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.