Begrenzen Sie, welche Rollen einen Knoten basierend auf seinem Inhaltstyp anzeigen können


18

Ich verwende Drupal 7 und habe einen neuen Inhaltstyp mit dem Namen "eBook" und eine neue Rolle mit dem Namen "MonthlySubscriber" erstellt. Meine Absicht ist es, nur Benutzern mit dem "MonthlySubscriber" zu erlauben, die "eBook" -Knoten anzuzeigen. Als ich mir die Berechtigungseinstellungen für eine Rolle ansah, sah ich die Kontrollkästchen, mit denen Knoten dieses Inhaltstyps erstellt, bearbeitet und gelöscht werden können, aber es gibt keine Kontrollkästchen zum Anzeigen von Knoten.

Wie beschränke ich die Benutzer, die "eBook" -Knoten anzeigen können, auf die Benutzer mit der Rolle "MonthlySubscriber"?

Antworten:


13

Sie müssen installieren Content Access Modul diese Zugriffskontrolle hinzuzufügen.

Mit diesem Modul können Sie Berechtigungen für Inhaltstypen nach Rolle und Autor verwalten. Sie können für jeden Inhaltstyp benutzerdefinierte Berechtigungen zum Anzeigen, Bearbeiten und Löschen festlegen.


5

Versuchen Sie für Drupal 7, hook_node_access () zu verwenden :

/**
 * 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
Bitte vermeiden Sie nur Code-Antworten. Sie dienen keinem Lernzweck. Erklären Sie zumindest in ein oder drei Sätzen, wie genau dieser bestimmte Code eine Antwort ist. Wie funktioniert es? warum funktioniert es Die Art von Beschreibung, die anderen hilft, ähnlichen Code in einer ähnlichen Situation zu schreiben, anstatt immer wieder danach zu fragen.
Mołot

Dies sollte die richtige Antwort sein.
Graficode

5

Hier ist eine einfache Möglichkeit, Knotenseiten (Node / NID) vor nicht privilegierten Benutzern zu schützen.

/**
 * 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
Beachten Sie, dass die Verwendung von hook_node_accessnichts funktioniert, das Knoten "auflistet", wie z. B. eine Ansicht. Sie können also den Ansichtszugriff in einschränken, eine Ansichts- hook_node_accessoder benutzerdefinierte Knotenabfrage zeigt dem Benutzer diesen Knoten jedoch möglicherweise weiterhin an. hook_node_accessist nützlicher für die redaktionelle Kontrolle, zum Steuern von Erstellungs- / Aktualisierungs- / Löschvorgängen
Brian

Ihr Code funktioniert bei mir nicht, aber Sie haben mich in die richtige Richtung gelenkt. Ich habe Arbeitscode in der hook_node_access-Dokumentation gefunden. Api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo

Dies ist ein schlechtes Beispiel, da mymodule_node_access als benutzerdefinierte Funktion verwendet wird, während Drupal einen hook_node_access-Hook bereitstellt. Dies kann verwirrend werden.
Batigolix

@batigolix, wie in der Antwort angegeben, ist eine Möglichkeit, Knotenseiten und nicht Knoten zu schützen.
ya.teck


1

Versuchen Sie für Drupal 7 Folgendes: Zugriff nach Begriff

Bietet sehr flexible, hierarchische Knotenzugriffskontrolle (Inhaltszugriffskontrolle) für D7.


0

Die oben von ya.teck gepostete hook_menu_alter-Lösung funktioniert zwar, steht jedoch in Konflikt mit dem standardmäßigen hook_node_access in seinem Funktionsnamen. das hook_menu_alter ist in diesem fall nicht erforderlich, und so ist die antwort von Denis oben meiner meinung nach genauer und der richtige weg. Wenn Sie das menu_item so ändern, wie es getan wurde, könnte das erste Beispiel, auf das verwiesen wird, von einem anderen Modul weiter unten in der Pipe gelöscht werden.


0

Ich habe ein Code-Snippet aus der D7-API-Dokumentation für den Hook "hook_node_access" verwendet .

Dieser Code gewährt Benutzern mit der Berechtigung "E-Book anzeigen" Zugriff auf das Anzeigen von E-Book-Inhalten.

Sie benötigen eine neue Berechtigung, um den Zugriff durch Implementieren von hook_permission () zu steuern.

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

Durch die Implementierung von hook_node_access () kann Drupal den Zugriff auf den Knoten gewähren oder verweigern.

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

Andere Berechtigungen (Bearbeiten, Löschen usw.) können über die normalen Drupal-Berechtigungen abgewickelt werden.

Optional können Sie den Inhalt aus der Administratorübersicht entfernen, indem Sie hook_query_TAG_NAME_alter implementieren.

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

Ich benutze das Modul Node View Permissions . Es ist einfacher als das Content Access-Modul.

Wie in D6 werden jedem von Ihnen ausgewählten Inhaltstyp die Berechtigungen "Beliebigen Inhalt anzeigen" und "Eigenen Inhalt anzeigen" hinzugefügt.

Bildbeschreibung hier eingeben

Schritte zum folgen:

  1. Gehen Sie nach der Installation und Aktivierung zu /admin/config/content/node-view-permissionsund wählen Sie die Inhaltstypen aus, auf die Sie den Zugriff beschränken möchten.
  2. Wechseln Sie dann zu /admin/people/permissions#module-node_view_permissions und wählen Sie die Rollen aus, für die Sie den Inhalt anzeigen möchten. Berechtigungen speichern.

    Getan!


für Drupal 8 "Node View Permissions" funktioniert nicht
Karthikeyan Manivasagam

@KarthikeyanManivasagam Wie so?
Chris Happy

Wir haben dieses Modul in einem unserer Projekte verwendet, in denen wir den Zugriff auf die Inhaltsansicht basierend auf Rolle und Inhaltstyp bereitstellen müssen, aber es funktioniert überhaupt nicht. Es verhält sich wie ohne Verwendung dieses Moduls.
Karthikeyan Manivasagam
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.