Fonctionnement et déclaration fonctions d’autorisations

Lorsque la fonction générique autoriser() est appelée, elle cherche une fonction nommée à laquelle déléguer la vérification.

La fonction autoriser($faire, $type, $id, $qui, $opt) qui peut recevoir jusqu’à 5 arguments cherche a appeler des fonctions plus spécifiques, nommées à partir des 2 premiers arguments reçu.

Si aucun $type n’est fourni dans l’appel à autoriser(), la recherche de la fonction se fait dans l’ordre suivant :

  • autoriser_$faire
  • autoriser_$faire_dist
  • autoriser_defaut
  • autoriser_defaut_dist

Si un $type est fourni dans l’appel à autoriser(), la recherche se fait dans l’ordre suivant :

  • autoriser_$type_$faire
  • autoriser_$type_$faire_dist
  • autoriser_$type
  • autoriser_$type_dist
  • autoriser_$faire
  • autoriser_$faire_dist
  • autoriser_defaut
  • autoriser_defaut_dist

Dans les deux cas, la recherche va du plus précis vers le plus général. Cela permet de définir des familles d’autorisation avec une règle générale (pour une action par exemple), que l’on précise ensuite pour certains objets qui suivent une règle différente.

Pour définir une autorisation, il suffit donc de créer une fonction avec l’un des noms de la liste ci-dessus. La fonction recevra les mêmes arguments que ceux envoyés à la fonction autoriser() et doit renvoyer true ou false.

On peut définir une autorisation générique. Lorsque c’est une autorisation qui n’est pas encore définie, on la suffixe en général par un _dist qui permet toujours à un webmestre de la surcharger dans son fichier mes_options.php (en déclarant la fonction de même nom, mais sans son suffixe _dist).

Attention : on voit que dans le nom de la fonction, l’ordre de $faire et $type est inversé par rapport à celui de l’appel à autoriser().
Notez que $type est par défaut un type d’objet : à partir de SPIP 3.0 le $type est présumé correspondre à un objet, et est normalisé lors de l’appel. Il est possible d’éviter cette normalisation en préfixant $type par un ’_’ (souligné). Dans tous les cas, tous les autres caractères ’_’ sont retirés du $type

Ainsi un appel à autoriser('modifier', 'groupes_mots', $id_groupe) déléguera à la fonction autoriser_groupemots_modifier() (ou l’une des variantes selon la règle ci-dessus si cette fonction précise n’existe pas).

Exemple de fonction d’autorisation

/**
 * Autoriser a creer un article :
 * Il faut qu'une rubrique existe et qu'on ait le statut necessaire pour creer
 *
 * @return bool
 */

function autoriser_article_creer_dist($faire, $type, $id, $qui, $opt) {
        return (sql_countsel('spip_rubriques')>0 AND in_array($qui['statut'], array('0minirezo', '1comite')));
}

Aide au développement

Lors du développement d’un plugin, il peut être utile de comprendre comment sont appelées les autorisations et dans quel ordre d’enchaînement.

Pour cela il suffit d’ajouter la ligne suivante dans le fichier mes_options.php :

define('_DEBUG_AUTORISER', true);

Chaque appel à autoriser() sera alors tracé dans le fichier spip.log avec le nom de la fonction appelée et le résultat qu’elle a retourné.

, par cedric