Come posso eseguire il debug delle autorizzazioni?


36

Come posso eseguire il debug delle autorizzazioni in Drupal 7?

Uso il core reporting, i log degli errori, i log degli errori del modulo di sviluppo, il backtrace e il blocco delle autorizzazioni di accesso al nodo, ma a volte non è sufficiente. Cos'altro devo controllare per scoprire perché determinati campi, viste o blocchi non vengono mostrati a un utente?

Ho anche scoperto che esiste un modulo per Drupal 6 per la segnalazione delle autorizzazioni chiamate ma non è disponibile per Drupal 7.

Sto usando vari moduli di terze parti relativi alle autorizzazioni:

 - 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

Questa potrebbe essere una parte importante della tua domanda: stai usando moduli contrib o di accesso al nodo personalizzati, come node_access ?
barista dilettante,

Nota per sé: node_access non è disponibile in D7, ma solo D6. Ma potrebbero esserci altri moduli di autorizzazione coinvolti.
barista dilettante,

@amateurbarista sì, sto usando i moduli di autorizzazione come ho detto in PS2.
Refineo,

Il modulo filter_perms è un equivalente di Drupal-7 del modulo
Permissions_report

Risposte:


21

Un modo che puoi fare è creare un modulo personalizzato, stampare le informazioni di accesso su ogni pagina, ogni nodo, ogni blocco.

La funzione menu_get_item () restituisce un elemento router con proprietà access_arguments per la pagina corrente.

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

Quindi puoi hook_page_alter, per visualizzare le informazioni di accesso in cima a ogni pagina.

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

Successivamente è possibile visualizzare le informazioni sull'autorizzazione del blocco in questo modo:

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

E così via, sostanzialmente lo stesso concetto, puoi fare lo stesso per nodo, forma, viste. Spero che sia di aiuto.


Quando gli argomenti di accesso yourmodule_get_page_access()non hanno senso, puoi dare un'occhiata $router_item['access_callback']e quindi cercare la funzione con quel nome nei moduli pertinenti per esaminare cosa sta succedendo lì. Bella risposta.
Wtower,

7

Modifica il file principale del modulo utente; trova la user_access()funzione, aggiungi 2 righe prima returndell'istruzione e monitora il registro errori PHP.

$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]);

Questo in realtà è abbastanza buono. Che ne dici delle autorizzazioni Field di debug?
Michal Przybylowicz,

Vedo i valori in drush, ma drush non sa chi sia l'utente. Ma non appare nella pagina definita in hook_menu. Non so perché no.
sam452,

error_lognon esce sullo schermo. Per la mia installazione, ha scritto nel registro degli errori di Apache. php.net/manual/en/function.error-log.php
Ryre

5

Sembra che tu abbia già tutti gli strumenti basati sulla GUI per la risoluzione dei problemi delle autorizzazioni. Un altro trucco avanzato (e probabilmente più difficile) che ho usato efficacemente in passato è:

  1. Costruisci una vista con i campi, i ruoli, i tipi di nodo, ecc. Che voglio testare.
  2. Abilita "query di visualizzazione" nella pagina delle opzioni avanzate di Views.
  3. Eseguire la vista e incollare la query SQL in un editor SQL basato su GUI come Navicat (commerciale) o MySQL Workbench (gratuito).
  4. Scopri quali nodi non vengono visualizzati.
  5. Modifica la query in base alle tue esigenze.

In molti casi le query che Views sputa sono piuttosto complesse (shock piene di join) e per costruirle manualmente richiederebbe un po 'più di tempo (inoltre sarebbe un po' più soggetto a errori). Inoltre, questo approccio garantisce che tu stia testando ciò che l'utente sta vedendo. Se hai abilitato i moduli di autorizzazione (che utilizzano le autorizzazioni principali di Drupal), i loro join di tabella verranno visualizzati nella query utilizzata da Views. Una volta ottenuta questa query, la modifico per mostrare quanti nodi del tipo di contenuto x sono consentiti per il ruolo x, ad esempio. È accurato e dettagliato come può ottenere la segnalazione. E quelli sono i miei rapporti "avanzati".


2

Con Drupal devo usare un debugger alcune volte (xdebug con netbeans). Molte funzioni sono chiamate indirettamente rendendo quasi impossibile seguire ciò che realmente accoda a livello globale solo leggendo il codice, stampando un backtrace o controllando l'output finale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.