hook_permission Drupal 7: Zugriffsberechtigungen für verschiedene Rollen
In den letzten Lektionen haben wir Seiten und Blöcke an verschiedenen Stellen ausgegeben und dabei die Eigenschaften 'access arguments' und 'access callback' verwendet, um Zugriffsbeschränkungen für Seiten zu definieren. In dieser Lektion erstellen wir die Möglichkeit einer flexibleren Zugriffskontrolle auf Aktionen mittels Administrationsseiten. Dafür verwenden wir hook_permission() (in Drupal 6 hieß das hook_perm()).
hook_permission()
Definiert Berechtigungen für Benutzer.
Dieser Hook kann Berechtigungen hinzufügen, so dass Ihr Modul festlegt, welche davon auf der Benutzerberechtigungsseite angezeigt werden. Außerdem wird der Hook verwendet, um vollständigen oder eingeschränkten Zugriff auf Aktionen zu ermöglichen, die das Modul ausführt.
Berechtigungen werden mit user_access() geprüft.
Rückgabewerte
Ein Array, dessen Schlüssel der Name der Berechtigung ist und dessen Wert ein Array mit folgenden Schlüssel-Wert-Paaren ist:
- title: Lesbarer Name der Berechtigung, der auf der Berechtigungsseite angezeigt wird. Dieser Wert sollte mit der Funktion t() übersetzt werden.
- description: (optional) Beschreibung der Berechtigung, ebenfalls mit t() für Übersetzbarkeit.
- restrict access: (optional) Boolean (true/false), der angibt, ob der Zugriff auf diese Berechtigung auf vertrauenswürdige Benutzer beschränkt werden sollte, um Sicherheitslücken zu vermeiden (z.B. für Filterverwaltung oder vollständige Node-Kontrolle). Wenn true, wird eine standardmäßige Fehlermeldung angezeigt.
- warning: (optional) Überschreibt die Standard-Fehlermeldung bei restrict access, wird selten verwendet, um Berechtigungen einheitlich und verständlich darzustellen.
Fügen wir diesen Hook zum Code aus der vorherigen Lektion hinzu:
function sitemade_permission(){ return array( 'view page example' => array( 'title' => t('View page example'), 'description' => t('View simple page example'), ), ); } function sitemade_menu(){ $items = array(); // Menüeinträge initialisieren $items['admin/config/content/page_example'] = array( // Seite unter 'admin/config/content/page_example' hinzufügen 'title' => 'Beispielseite', // Seitentitel 'description' => 'Einfache Seite', // Beschreibung 'page callback' => '_page_example', // Funktion zur Ausgabe des Seiteninhalts 'access arguments' => array('view page example'), // Zugriffsrechte entsprechend hook_permission ); return $items; // Liste der Seiten zurückgeben } function _page_example($content = NULL) { $content = ''; // Variable für leeren Inhalt initialisieren $query = db_select('node_revision', 'n'); // Tabelle node_revision auswählen, die aktuelle Revisionen enthält $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid'); // Tabelle field_revision_body mit Body-Daten joinen $query->innerJoin('node', 'd', 'n.nid = d.nid'); // Tabelle node mit Titeln joinen $query->fields('n', array('title'), array('nid'), array('vid')); // Felder auswählen $query->fields('b', array('body_value')); $query->condition('d.type', 'news'); // Filter für Inhaltstyp 'news' $query->orderBy('n.timestamp', 'DESC'); // Nach Datum absteigend sortieren $query->range(0, 10); // Nur 10 Einträge auswählen $result = $query->execute(); // Query ausführen while ($nodes = $result->fetch()) { // Ergebnisse verarbeiten $content .= '<h3>' . $nodes->title . '</h3>'; // Titel ausgeben $content .= $nodes->body_value; // Body ausgeben } return $content; // Inhalt zurückgeben }
Jetzt erscheint auf der Berechtigungsseite admin/people/permissions eine neue Berechtigung:
Setzen Sie die Berechtigung nur für Administratoren, damit normale Benutzer die Seite nicht sehen können. Nun wird normalen Benutzern der Zugriff auf admin/config/content/page_example mit einer 403-Fehlerseite verweigert.
Im nächsten Tutorial erstellen wir eine Administrationsseite mit einem Formular zur Einstellung unserer Website unter Verwendung des Drupal Forms API.