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"?

John
quelle

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.

iStryker
quelle
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;
}
Denis
quelle
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);
}
ya.teck
quelle
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
2

Content Access funktionierte bei meiner Drupal 7-Installation nicht, daher habe ich stattdessen die Node View-Berechtigungen verwendet.

Sam King
quelle
1

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

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

washooo
quelle
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.

ben.hamelin
quelle
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', '!=');
  }
}
Batigolix
quelle
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!

Chris glücklich
quelle
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