Comment déboguer les autorisations dans Drupal 7?
J'utilise les rapports de base, les journaux d'erreurs, les journaux d'erreurs du module de développement, la trace et le bloc d'autorisation d'accès aux nœuds, mais parfois ce n'est pas suffisant. Que dois-je vérifier d'autre pour savoir pourquoi certains champs, vues ou blocs n'apparaissent pas à un utilisateur?
J'ai également trouvé qu'il y a un module pour Drupal 6 pour les rapports sur les autorisations appelées 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
Vous pouvez notamment créer un module personnalisé, 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 a 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 d'autorisation de bloc 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, essentiellement le même concept, vous pouvez faire de même pour les nœuds, les formulaires et les vues. J'espère que cela t'aides.
Modifiez le fichier principal du module utilisateur; recherchez la fonction user_access()
, ajoutez 2 lignes avant l'instruction return
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]);
Il semble que vous ayez déjà tous les outils basés sur l'interface graphique pour dépanner les autorisations. Une astuce plus avancée (et probablement plus difficile) que j'ai utilisée efficacement dans le passé est:
Dans de nombreux cas, les requêtes émises par Views sont assez complexes (choc plein de jointures) et les construire manuellement prendrait un peu plus de temps (en plus, ce serait un peu plus sujet aux erreurs). Cette approche garantit également que vous testez par rapport à ce que l'utilisateur voit. Si vous avez des modules d'autorisations activés (qui utilisent Drupal autorisations de base), leurs jointures de table s'afficheront dans la requête utilisée par Views. Une fois que j'ai obtenu cette requête, je l'ai modifiée pour montrer comment de nombreux noeuds de type de contenu x sont autorisés pour le rôle x, par exemple. Il est aussi précis et fin que les rapports peuvent l'être. Et ce sont mes rapports "avancés".
Avec Drupal je dois parfois utiliser un débogueur (xdebug avec netbeans). Beaucoup de fonctions sont appelées indirectement, ce qui rend presque impossible de suivre ce qui s’ajoute vraiment globalement en lisant uniquement le code, en imprimant une trace ou vérification de la sortie finale.