Voilà, voilà... Fin de l'aventure...

 

Fermeture de kolossaldrupal.org dans...


Bonjour tout le monde,

Drupal évolue, les versions changent et Kolossaldrupal.org était essentiellement consacré à la version 6 de Drupal.

Autant dire que les infos présentées ici commencent à dater...

Faute de temps, je ne peux plus garder le site Kolossaldrupal à jour...

Je vous aurais bien proposé de reprendre le flambeau mais... c'est tellement simple de nos jours de se faire son propre site à soi...Pourquoi s'embêter alors ? :-)

Ce site restera donc en l'état, tel qu'il était en 2011...

Ah la la ! Cela ne nous rajeunit pas !

Manuel Vila - Avril 2016

Contrôle d'accès

Référence en anglais sur drupal.org : 21 Mars 2009 - 04h25
http://drupal.org/node/109157


Tenez en compte que certains aspects du contrôle d'accès ont été modifiés dans Drupal 6.2. les présentes pages du manuel reflètent ces modification de l'API (en savoir plus) .

access callback et access arguments décident si l'utilisateur a accès ou pas à une entrée de menu donnée.

<?php
  $items
['admin/user/roles'] = array(
    
'title' => 'Roles',
    
'description' => 'List, edit, or add user roles.',
    
'access callback' => 'user_access',
    
'access arguments' => array('administer access control'),
  );
?>

Le système de menu appellera la fonction user_access avec les arguments administer acess control.

Si votre module déclare access arguments mais ne déclare pas access callback, alors le système de menu utilisera par défaut user_access en tant que access callback. En d'autres termes :

<?php
  $items
['admin/user/roles'] = array(
    
'title' => 'Roles',
    
'description' => 'List, edit, or add user roles.',
    
'access arguments' => array('administer access control'),
  );
?>

est équivalent à :

<?php
  $items
['admin/user/roles'] = array(
    
'title' => 'Roles',
    
'description' => 'List, edit, or add user roles.',
    
'access callback' => 'user_access'// menu system adds this callback automatically
    
'access arguments' => array('administer access control'),
  );
?>

Depuis Drupal 6.2, access callback et access arguments n'héritent plus de leurs éléments parents. Cette modification de l'API a été faite pour s'assurer que chaque élément de menu est correctement sécurisé par un contrôle d'accès. Ce qui, pour vous, veut dire que :

  • si vous déclarez access arguments, alors vous pouvez être tout à fait sûr que user_access sera le access callback par défaut.

  • si à la place vous voulez utiliser un access callback personnalisé, vous devrez le déclarer pour chaque élément de menu.

    Remarque : vous n'avez bien évidemment besoin de les définir que pour les éléments de menus que vous utiliserez. La déclaration souligne que le callback n'est pas héréditaire. Si vous spécifiez un callback pour certains éléments de menu mais pas pour d'autres, les autres utiliseront toujours user_access.

  • Vous avez besoin de définir access arguments pour chaque élément de menu.

    Remarque : si vous ne définissez pas access arguments alors ils le seront par défaut pour le tableau vide. Si vous avez défini un access callback personnalisé qui ne prend pas d'arguments (comme dans l'exemple printer_friendly_access précédent), cela ne posera pas de problème (c'est un des cas pour lesquels il est logique de ne pas déclarer des access arguments). À nouveau, la déclaration ci-dessus souligne que les access arguments ne s'héritent en aucune façon.

  • Les tâches locales par défaut sont bien évidemment l'exception à tout ce qui précède.

La seule exception à tout cela est pour les éléments de type MENU_DEFAULT_LOCAL_TASK : ils héritent toujours des access callbacks et des access arguments de leur élément parent.

<?php
  $items
['user'] = array(
    
'title' => 'My account',
    
'page callback' => 'user_view',
    
'page arguments' => array(1),
    
'access callback' => 'user_view_access',
    
'access arguments' => array(1),
  );
  
$items['user/%user'] = array(
    
'title' => 'View',
    
'access callback' => 'user_view_access',
    
'access arguments' => array(1),
  );
  
$items['user/%user/view'] = array(
    
'title' => 'View',
    
'type' => MENU_DEFAULT_LOCAL_TASK,
  );
  
$items['user/%user/edit'] = array(
    
'title' => 'Edit',
    
'page callback' => 'user_edit',
    
'access arguments' => array('administer users'),
    
'type' => MENU_LOCAL_TASK,
  );
  
$items['user/%user/delete'] = array(
    
'title' => 'Delete',
    
'page callback' => 'user_edit',
    
'access arguments' => array('administer users'),
    
'type' => MENU_CALLBACK,
  );
?>

  • user/%user n'hérite pas de access callback ou de access arguments de leur élément parent. Comme un callback appelle toujours user_access par défaut, nous n'avons généralement pas besoin de le déclarer explicitement. Mais comme à la place nous voulons un callback personnalisé, nous devons déclarer les deux access callback et access arguments explicitement.
  • user/%user/view hérite du access callback et du access arguments de leur élément parent, puisqu'il s'agit d'un élément de type MENU_DEFAULT_LOCAL_TASK.
  • user/%user/edit et user/%user/delete n'héritent pas de access callback ou de access arguments de leur élément parent. Comme un callback appelle toujours user_access par défaut, il n'a pas besoin d'être explicitement déclaré. Ce que nous avons besoin de déclarer explicitement est access arguments.

'access callback' => TRUE(tous les utilisateurs et tous les anonymes ont le droit d'accès) (et 'access callback' => FALSE, pas d'accès pour personne).

Bien souvent, vous ne trouverez pas de callback répondant à vos besoins. Dans ce cas, vous devriez en écrire un :

<?php
function printer_friendly_access()
  return 
user_access('access content') && user_access('see printer-friendly version');
}
?>

Bien entendu, le callback peut être beaucoup plus complexe :

<?php
function user_view_access($account) {
  return 
$account && $account->uid &&
    (
      
// Always let users view their own profile.
      
($GLOBALS['user']->uid == $account->uid) ||
      
// Administrators can view all accounts.
      
user_access('administer users') ||
      
// The user is not blocked and logged in at least once.
      
($account->access && $account->status && user_access('access user profiles'))
    );
}
...
  
$items['user/%user_current'] = array(
    
'access callback' => 'user_view_access',
    
'access arguments' => array(1),
  );
?>

Remarque importante : la valeur de access callback doit toujours être une chaîne de caractères qui est le nom de la fonction - jamais un appel de fonction. On peut également lui assigner la valeur TRUE ou FALSE selon que la page soit toujours, ou jamais, accessible.