Ogranicz, które role mogą wyświetlać węzeł na podstawie jego typu zawartości

18

Korzystam z Drupal 7 i stworzyłem nowy typ zawartości o nazwie „eBook” i utworzyłem nową rolę o nazwie „MonthlySubscriber”. Moim zamiarem jest zezwolenie tylko użytkownikom z „MonthlySubscriber” na przeglądanie węzłów „eBook”. Kiedy spojrzałem na ustawienia uprawnień dla roli, zobaczyłem pola wyboru, które pozwalają tworzyć, edytować i usuwać węzły tego typu treści, ale nie ma żadnych pól wyboru do przeglądania węzłów.

Jak ograniczyć użytkowników, którzy mogą przeglądać węzły „eBook”, tylko do użytkowników z rolą „MonthlySubscriber”?

Jan
źródło

Odpowiedzi:

13

Aby dodać tę kontrolę dostępu, musisz zainstalować moduł Content Access .

Ten moduł umożliwia zarządzanie uprawnieniami do typów treści według roli i autora. Pozwala określić niestandardowe uprawnienia do wyświetlania, edycji i usuwania dla każdego typu zawartości.

iStryker
źródło
5

W przypadku drupal 7 spróbuj użyć 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
źródło
1
Unikaj odpowiedzi tylko na kod. Nie służą celom uczenia się. Przynajmniej wyjaśnij w zdaniu lub trzech, jak dokładnie ten konkretny kod jest odpowiedzią? Jak to działa? dlaczego to działa Rodzaj opisu, który pomoże innym napisać podobny kod w podobnej sytuacji, zamiast pytać wielokrotnie.
Mołot
To powinna być poprawna odpowiedź.
GrafiCode
5

Oto prosty sposób ochrony stron węzłów (węzeł / NID) przed nieuprzywilejowanymi użytkownikami.

/**
 * 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
źródło
2
Pamiętaj, że użycie hook_node_accessnie będzie działać z niczym, co „wyświetla” węzły, np. Widok. Możesz więc ograniczyć dostęp do widoku hook_node_access, ale zapytanie dotyczące widoku lub niestandardowego węzła może nadal pokazywać ten węzeł użytkownikowi. hook_node_accessjest bardziej przydatny do kontroli redakcyjnej, do kontrolowania operacji tworzenia / aktualizacji / usuwania
Brian
Twój kod nie działa dla mnie, ale wskazałeś mi właściwy kierunek. Znalazłem działający kod w dokumentacji hook_node_access api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo
Jest to zły przykład, ponieważ używa mymodule_node_access jako funkcji niestandardowej, podczas gdy Drupal zapewnia hook_node_access hook. To może stać się mylące.
batigolix
@batigolix, jak stwierdzono w odpowiedzi, jest to sposób ochrony stron węzłów, a nie węzłów.
ya.teck
1

W przypadku drupal 7 wypróbuj ten: Access by Term

Zapewnia bardzo elastyczną, hierarchiczną kontrolę dostępu do węzłów (kontrola dostępu do treści) dla D7.

washooo
źródło
0

Rozwiązanie hook_menu_alter opublikowane powyżej przez ya.teck działa, ale powoduje konflikt ze standardowym hook_node_access w nazwie funkcji. hook_menu_alter nie jest w tym przypadku wymagany, więc odpowiedź zamieszczona przez Denisa powyżej jest moim zdaniem bardziej dokładna i właściwa. Pierwszy raz przywoływany przykład może zostać zmieniony przez inny moduł w dalszej części potoku.

ben.hamelin
źródło
0

Użyłem fragmentu kodu znalezionego w dokumentacji interfejsu API D7 dla haka hook_node_access .

Ten kod zapewni dostęp do przeglądania treści „ebook” użytkownikom, którzy mają uprawnienia do „przeglądania ebooka”.

Potrzebujesz nowego uprawnienia do kontrolowania dostępu poprzez wdrożenie hook_permission ().

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

Poprzez wdrożenie hook_node_access () Drupal może udzielić lub odmówić dostępu do węzła.

/**
 * 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;
}

Innymi uprawnieniami (edycja, usuwanie itp.) Można zarządzać za pomocą zwykłych uprawnień Drupal.

Opcjonalnie możesz usunąć treść z przeglądu administratora, wdrażając 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
źródło
0

Perfer korzystam z modułu uprawnień do wyświetlania węzłów . To prostsze niż moduł Content Access.

Podobnie jak w D6, dodaje uprawnienia „Wyświetl dowolną zawartość” i „Wyświetl własną zawartość” do dowolnego wybranego rodzaju treści.

wprowadź opis zdjęcia tutaj

Kroki do naśladowania:

  1. Po zainstalowaniu i włączeniu przejdź do /admin/config/content/node-view-permissionsi wybierz typy zawartości, do których chcesz ograniczyć dostęp.
  2. Następnie przejdź do /admin/people/permissions#module-node_view_permissions i wybierz role, które chcesz móc wyświetlić zawartość. Zapisz uprawnienia.

    Gotowy!

Chris Happy
źródło
dla drupal 8 „Uprawnienia do podglądu węzła” nie działa
Karthikeyan Manivasagam
@KarthikeyanManivasagam Jak to zrobić?
Chris Happy
Korzystaliśmy z tego modułu w jednym z naszych projektów, w którym musimy zapewnić dostęp do widoku zawartości na podstawie roli i typu zawartości, ale w ogóle nie działa. zachowuje się tak samo, jak bez korzystania z tego modułu.
Karthikeyan Manivasagam