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).
$faire
et $type
est inversé par rapport à celui de l’appel à autoriser()
.
$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é.