Wie debugge ich Berechtigungen?

36

Wie debugge ich Berechtigungen in Drupal 7?

Ich verwende Kernberichte, Fehlerprotokolle, Entwicklungsmodul-Fehlerprotokolle, Rückverfolgungs- und Knotenzugriffsberechtigungsblock, aber manchmal ist es nicht genug. Was sollte ich noch überprüfen, um herauszufinden, warum bestimmte Felder, Ansichten oder Blöcke einem Benutzer nicht angezeigt werden?

Ich habe auch festgestellt, dass es für Drupal 6 ein Modul gibt , mit dem Berechtigungen gemeldet werden können, das für Drupal 7 jedoch nicht verfügbar ist.

Ich verwende verschiedene Module von Drittanbietern, die sich auf Berechtigungen beziehen:

 - devel node access 7.x-1.x-dev 
 - fast permissions administration 7.x-2.0
 - organic groups access control 7.x-1.x 
 - profile2 group access 7.x-1.x-dev 
 - ur-node access 7.x-1.x-dev
Refineo
quelle
Dies könnte ein wichtiger Teil Ihrer Frage sein: Verwenden Sie Contrib- oder benutzerdefinierte Knotenzugriffsmodule, z. B. node_access ?
Amateur Barista
Hinweis für sich selbst: node_access ist in D7 nicht verfügbar, nur in D6. Es können aber auch andere Berechtigungsmodule beteiligt sein.
Amateur Barista
@amateurbarista Ja, ich verwende Berechtigungsmodule wie in PS2 erwähnt.
Refineo
Das Modul filter_perms ist ein Drupal-7-Äquivalent des oben erwähnten Moduls permissions_report
Druvision vom

Antworten:

21

Eine Möglichkeit besteht darin, ein benutzerdefiniertes Modul zu erstellen und Zugriffsinformationen auf jeder Seite, jedem Knoten und jedem Block auszudrucken.

menu_get_item () - Funktion gibt ein Routerelement zurück, das die Eigenschaft access_arguments für die aktuelle Seite hat.

/**
 * Show access permission of current page.
 */
function yourmodule_get_page_access() {

  $router_item = menu_get_item();
  if ($router_item) {

    $access_arguments = unserialize($router_item['access_arguments']);

    $arguments = array();
    foreach ($access_arguments as $access_argument) {
      $arguments[] = $access_argument;
    }
    if ($arguments) {
      $output  = '<p>';
      $output .= t('This page needs user to have %p permission(s) to access', array(
        '%p' => implode(', ', $arguments),
      ));
      $output .= '</p>';
    }
    else {
      $output = '<p>' . t('This page needs no user permissions') . ' </p>';
    }
    return $output;
  }
}

Dann können Sie hook_page_alter, um die Zugangsdaten oben auf jeder Seite anzuzeigen.

/**
 * Implements hook_page_alter().
 *
 * Display access information on top of every page.
 */
function yourmodule_page_alter(&$page) {

  // Make a new area on top of the page for displaying access information.
  $page['content']['theverytop']['#markup'] = yourmodule_get_page_access();
  $page['content']['theverytop']['#weight'] = -10;
  $page['content']['#sorted'] = FALSE;
}

Als nächstes können Sie die Informationen zu den Sperrberechtigungen wie folgt anzeigen:

/**
 * Implement hook_block_alter
 *
 * To display block permission information to the block title.
 */

function yourmodule_block_view_alter(&$data, $block) {
  $delta = $block->delta;
  $output = '';

  $rid = db_query("SELECT rid FROM {block_role} WHERE delta = :delta", array(':delta' => $delta))->fetchCol();

  if (empty($rid)) {
      $output = ' This block does not have any role permission restriction.';
  } else {
      $output = ' This block is viewable for users have role(s): ';
      foreach ($rid as $role_id) {
          $rolename = db_query("SELECT name from {role} where rid = :rid", array(':rid' => $role_id))->fetchField();
          $output .= $rolename . ' ';
      }
  }

  // append the permission info to block title for every block
  $block->title .= $output;
}

Und so weiter, im Grunde das gleiche Konzept, können Sie das gleiche für Knoten, Formulare und Ansichten tun. Hoffe das hilft.

Gilzero
quelle
Wenn die Zugriffsargumente yourmodule_get_page_access()keinen Sinn ergeben, können Sie $router_item['access_callback']in den entsprechenden Modulen nach der Funktion mit diesem Namen suchen, um zu sehen, was dort vor sich geht. Gute Antwort.
Wtower
7

Bearbeiten Sie die Hauptdatei des Benutzermoduls. Suchen Sie die user_access()Funktion, fügen Sie 2 Zeilen vor der returnAnweisung hinzu und überwachen Sie das PHP-Fehlerprotokoll.

$granted = isset($perm[$account->uid][$string]);
error_log(sprintf('--- user_access: %s "%s" = %s', $account->name, $string, $granted ? 'yes' : 'no'));
return isset($perm[$account->uid][$string]);
temoto
quelle
Das ist eigentlich ziemlich gut. Wie wäre es mit dem Debuggen von Feldberechtigungen?
Michal Przybylowicz
Ich sehe die Werte in drush, aber drush weiß nicht, wer der Benutzer ist. Es wird jedoch nicht auf der Seite angezeigt, die in hook_menu definiert ist. Unsicher warum nicht.
sam452
error_logwird nicht auf dem Bildschirm ausgegeben. Für meine Installation schrieb es in das Apache-Fehlerprotokoll. php.net/manual/en/function.error-log.php
Ryre
5

Anscheinend verfügen Sie bereits über alle GUI-basierten Tools zur Problembehandlung von Berechtigungen. Ein fortgeschrittener (und wahrscheinlich schwierigerer) Trick, den ich in der Vergangenheit effektiv angewendet habe, ist:

  1. Erstellen Sie eine Ansicht mit den Feldern, Rollen, Knotentypen usw., auf die ich testen möchte.
  2. Aktivieren Sie auf der Seite mit den erweiterten Optionen für Ansichten die Option "Abfrage anzeigen".
  3. Führen Sie die Ansicht aus und fügen Sie die SQL-Abfrage in einen GUI-basierten SQL-Editor wie Navicat (kommerziell) oder MySQL Workbench (kostenlos) ein.
  4. Sehen Sie, welche Knoten nicht angezeigt werden.
  5. Passen Sie die Abfrage an Ihre Bedürfnisse an.

In vielen Fällen sind die Abfragen, die Views ausspucken, ziemlich komplex (voller Verknüpfungen), und die manuelle Erstellung würde etwas mehr Zeit in Anspruch nehmen (außerdem wäre dies etwas fehleranfälliger). Auch dieser Ansatz stellt sicher, dass Sie gegen das testen, was der Benutzer sieht. Wenn Sie Berechtigungsmodule aktiviert haben (die Drupal-Kernberechtigungen verwenden), werden deren Tabellenverknüpfungen in der von Views verwendeten Abfrage angezeigt. Sobald ich diese Abfrage erhalten habe, ändere ich sie, um zu zeigen, wie viele Knoten des Inhaltstyps x beispielsweise für die Rolle x zulässig sind. Es ist so genau und feinkörnig wie es nur möglich ist, Berichte zu erstellen. Und das sind meine "fortgeschrittenen" Berichte.

Amateur Barista
quelle
2

Mit Drupal muss ich mal einen Debugger benutzen (xdebug mit netbeans). Viele Funktionen werden indirekt aufgerufen, was es fast unmöglich macht, dem zu folgen, was wirklich global angehängt wird, indem nur der Code gelesen, eine Rückverfolgung gedruckt oder die endgültige Ausgabe überprüft wird.

gagarine
quelle