Comment déboguer les autorisations?

36

Comment déboguer les autorisations dans Drupal 7?

J'utilise des rapports de base, des journaux d'erreurs, des journaux d'erreurs de module de développement, des blocs de traçabilité et des autorisations d'accès aux nœuds, mais parfois cela ne suffit pas. Que dois-je vérifier pour savoir pourquoi certains champs, vues ou blocs ne sont pas affichés pour un utilisateur?

J'ai également découvert qu'il existe un module pour Drupal 6 permettant de créer des rapports sur les autorisations, mais il n'est pas disponible pour Drupal 7.

J'utilise divers modules tiers liés aux autorisations:

 - 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
Affiner
la source
Cela pourrait constituer une partie importante de votre question: Utilisez-vous des modules d'accès contrib ou customisés aux nœuds, tels que node_access ?
amateur barista
Note à moi-même: node_access n'est pas disponible dans D7, mais uniquement dans D6. Mais il pourrait y avoir d'autres modules de permission impliqués.
amateur barista
@amateurbarista Oui, j'utilise des modules de permission comme je l'ai mentionné dans PS2.
Affiner
Le module filter_perms est un équivalent Drupal-7 du module permissions_report mentionné ci-dessus
Druvision le

Réponses:

21

Une façon de faire est de créer un module personnalisé, d’imprimer les informations d’accès sur chaque page, chaque nœud, chaque bloc.

La fonction menu_get_item () renvoie un élément de routeur qui possède la propriété access_arguments pour la page actuelle.

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

Ensuite, vous pouvez hook_page_alter, pour afficher les informations d'accès en haut de chaque page.

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

Ensuite, vous pouvez afficher les informations sur les autorisations de blocage comme ceci:

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

Et ainsi de suite, fondamentalement le même concept, vous pouvez faire la même chose pour le noeud, la forme, les vues. J'espère que cela t'aides.

Gilzero
la source
Lorsque les arguments d'accès yourmodule_get_page_access()n'ont aucun sens, vous pouvez jeter un coup d'œil sur $router_item['access_callback'], puis rechercher la fonction portant ce nom dans les modules appropriés, afin de voir ce qui se passe là-dedans. Très bonne réponse.
Wtower
7

Editez le fichier principal du module utilisateur; recherchez la user_access()fonction, ajoutez 2 lignes avant l' returninstruction et surveillez le journal des erreurs 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]);
temoto
la source
C'est vraiment très bon. Qu'en est-il des autorisations de débogage sur le terrain?
Michal Przybylowicz
Je vois les valeurs dans Drush, mais Drush ne sait pas qui est l'utilisateur. Mais cela n'apparaît pas sur la page définie dans hook_menu. Je ne sais pas pourquoi pas.
Sam452
error_logne sort pas à l'écran. Pour mon installation, il a écrit dans le journal des erreurs Apache. php.net/manual/fr/function.error-log.php
Ryre
5

Il semble que vous ayez déjà tous les outils à base d'interface graphique pour résoudre les problèmes d'autorisations. Une astuce plus avancée (et probablement plus difficile) que j'ai utilisée efficacement par le passé est la suivante:

  1. Construisez une vue avec les champs, rôles, types de nœuds, etc. que je souhaite tester.
  2. Activez la "requête d'affichage" sur la page des options avancées de Vues.
  3. Exécutez la vue et collez la requête SQL dans un éditeur SQL basé sur une interface graphique, tel que Navicat (commercial) ou MySQL Workbench (gratuit).
  4. Voyez quels noeuds n'apparaissent pas.
  5. Tweak la requête à vos besoins.

Dans de nombreux cas, les requêtes générées par Views sont plutôt complexes (choc plein de jointures) et leur construction manuelle prendrait un peu plus de temps (en plus, elle serait un peu plus sujette aux erreurs). Cette approche garantit également que vous testez par rapport à ce que voit l'utilisateur. Si des modules d'autorisations sont activés (qui utilisent les autorisations principales de Drupal), leurs jointures de table s'affichent dans la requête utilisée par Views. Une fois cette requête obtenue, je la modifie pour montrer combien de nœuds de type de contenu x sont autorisés pour le rôle x, par exemple. C'est aussi précis et précis que le rapport peut en obtenir. Et ce sont mes "rapports avancés".

barista amateur
la source
2

Avec Drupal, je dois parfois utiliser un débogueur (xdebug avec netbeans). Beaucoup de fonctions sont appelées indirectement, rendant presque impossible de suivre ce qui est réellement ajouté globalement en lisant le code, en imprimant une trace en arrière ou en vérifiant la sortie finale.

gagarine
la source