Carnet Wiki

Plugin ACL

Le système d’autorisations de SPIP -tel que décrit dans Autorisations Dans Spip- est très structuré et relativement facile à utiliser et étendre, en particulier par un modèle de fonctions pour les plugins ; cela représente un atout par rapport aux autres CMS...

Néanmoins, il présente quelques inconvénients d’usage :
-  par exemple il n’est accessible que par programmation php [1] et il n’existe aucune interface d’administration clicable (sauf, en partie, avec le Couteau Suisse #CS)
-  il n’est pas directement gérable par groupes ou zones
-  il n’est pas facile d’affecter directement des droits ponctuels à un auteur, ou à un groupe
-  l’usage du pipeline standard n’autorise pas de corréler plusieurs autorisations de plugins différents (voir ciautoriser : plugin « Pipeline pour autoriser » pour une solution malheureusement incompatible avec le standard SPIP)

-  le plugin Acces Restreint pourrait être étendu, cf. Etendre Acces Restreint au-delà des Rubriques ?..

Cette page de carnet propose de regrouper pour discussion diverses approches.

Récapitulation des informations sur le sujet


-  l’API Autoriser définie depuis SPIP 2, son pipeline Autoriser et son code
-  Programmer des Autorisations et le Fonctionnement et déclaration des fonctions d’autorisations,
-  le pipeline Autoriser et son code
-  l’usage du pipeline dans programmer.spip
-  des exemples d’utilisation sont aussi disponibles dans le CS, ainsi qu’une lame de Securité ecrire/?exec=admin_couteau_suisse&cmd=descrip&outil=autorisations rappelant toutes les fonctions d’autorisations disponibles dans SPIP, et permettant d’en créer de nouvelles.

Enfin, un dernier point à prendre en compte : toute solution doit être adaptée à la gestion en volume (dans l’annuaire de SPIP ou depuis un annuaire exterieur LDAP/AD ou CAS) : les traitements individuels par auteur ne seront qu’une personnalisation exceptionnelle et ponctuelle, à limiter aux caps particuliers.

On pourrait aussi adjoindre la problématique classique, à nouveau espérée par Pierretux cet hiver, d’un annuaire d’auteurs multi-sites (à partir de LDAP ou autre...)

Des solutions actuelles

Plusieurs extensions au core de spip permettent des fonctionnements complémentaires (sans compter les divers plugins de gestion d’accès) :
-  le plugin autorité
-  la solution opérationnelle proposée par [dev] Les autorisations du Couteau Suisse et sa lame ’Sécurité / Fonctions d’autorisations’
-  le plugin ciautoriser (étendant/redéfinissant le pipeline correspondant) pour ciar : plugin « Accès restreints issus de Giseh »
-  la démarche de David... (cf. mails du 25/11/2015 et 17/08/2016 sur spip-dev)
-  la réflexion sur une table d’ACL pré-générant des fonctions autoriser surchargeantes
-  sans oublier la réflexion de Cerdic pour étendre AR aux articles : Accès restreint V2 - Les objectifs.

Les Zones d’Acces Restreint ne sont pas evoquées ici, alors meme qu’elles proposent déjà une notion implicite de groupe : il serait tellement facile de les utiliser pour des #AUTORISER{'zone',#ID_ZONE...} sans mettre de restriction de rubriques ; toutefois pour un usage complémentaire plus développé, il manque la possibilité de sélectionner de nombreux auteurs d’un coup /facilites ergonomiques/..

0. le Plugin Autorité

Ce plugin surcharge certaines autorisations, avec des écrans de configurations ; sa documentation (ancienne, pourrait être complétée, en particulier sur un plan technique.) liste les diverses autorisations paramétrables, sans expliciter les verbes d’autorisation modifiée...

1. la syntaxe descriptive simplifiée du Couteau Suisse

Dans la lame Fonctions d’autorisations (du groupe Sécurité - non documentée), le Couteau Suisse (« CS ») propose
-  d’une part la récupération de toutes les fonctions d’autorisations du site (voir source [2]),
-  d’autre part, d’en générer de nouvelles, avec une syntaxe allégée, et proposant des alias pour ces autorisations (voir source [3])....

La syntaxe est : « qui : faire type id = alias » , dont quelques exemples sont donnés :

// creer article = creer rubrique
// 23 : modifier article 18 = ok
// configurer cs = webmestre
// auteur 7 = niet

Ainsi le CS rend disponible deux fonctions fort utiles :

  • la génération du code de fonctions d’autorisations supplémentaires (compatible SPIP),
  • une reprise simple de toutes les fonctions d’autorisations existantes (des plugins activés) !

2. Le plugin ciautoriser

Proposé pour développer la compatibilité Gizeh, l’un des nombreux plugins d’Equipement développe une extension facilitant l’utilisation multiple du pipeline standard autoriser de SPIP : voir son analyse PDF et son implémentation actuelle.. Cela permet en particulier de gérer des autorisations par groupes....

3. Un plugin ACL

Un projet de David Fredette en-cours d’etude
-  PDF : Analyse PDF
-  PDF Implémentation,
-  Discussion sur spip-dev au 25/11/2015, poursuivie depuis le 17/08/2016...
(hélas, tous ces liens Canadiens semblent avoir disparu Avril 2023)]

4. Une base ACL en table

Une réflexion déjà ancienne, à réactualiser par YannX !

L’idée, en bref : construire une table spip_acl permettant de préempter les définitions par défaut de SPIP, en surchargeant le code d’autorisation par construction au vol d’une fonction à partir de l’exploration de la table : cela reprendrait partiellement la pratique du CS, mais à partir d’une requete SQL et non de saisies textes [4] .
-  les champs de la table : correspondent essentiellement aux champs de la fonction autoriser ( $faire , $type ,  $id , array $qui , array $opts ) :

  • id_acl : champ d’index pour estre compatible avec les API de manipulation d’objet éditorial
  • objet  : type de l’objet considéré (avec caractères génériques)
  • id_objet /valeur facultative/ : pour restreindre à une instance (avec caractères génériques)
  • faire : identifiant textuel caractéristique de l’autorisation pilotée(attention aux droits composés avec des underscores)
  • groupe-objet : à priori ’auteur’ pour gérer directement les droits par auteur,
    mais prévoir cette zone permet éventuellement d’imaginer des extensions dans le modèle, en restant lié à la structuration par modèle d’objets éditoriaux (ex. ZAR)
  • id_auteur (ou id_user ?) : restriction à un individu $qui [5] (avec caractères génériques), ou indication d’un statut générique (alphanumérique) [6]
  • options pour pouvoir étendre des conditions liées, ou les exceptions
    (S’inspirer de certaine syntaxe evoquée par le CS ?)
  • alias : nommer la ligne par un alias permettra de la traiter comme élément d’uen condition plus complexe,
    donc on ouvre déjà la structure aux traitements divers dépassant une simple coordination logique.
  • commentaires : pour pouvoir documenter /par le webmestre, ou le gestionnaire/ l’usage de cette ligne d’autorisations (et ses conséquences). [7]

La gestion dans une table en BDD permet de traiter très simplement les OR, la gestion des conditions liées en AND étant à reporter alors dans les options (par des alias de clauses nommées ? ou par des ajouts d’exceptions, ou de conditions supplémentaires, par exemple sur le statut des auteurs considérés)...
Idée : utiliser le plugin Acces Restreint-ZAR (qui permet de définir des groupes d’auteurs en zone d’accès restreint) pour piloter la notion de groupe de rôles, sans utiliser la gestion par rubriques...
Il faudrait aussi prévoir l’implémentation d’une hiérarchie des autorisations (par surcharge en programmation objet des fonctions autorisations)

L’implémentation serait alors d’ajouter en pré-exécution dans le code d’appel d’autoriser, l’appel à une fonction autoriser_acl( $faire , $type ,  $id , array $qui , array $opts ) qui renverrait une autorisation extraite de la table ACL si elle existe , en plus de celle éventuellement trouvée par l’appel traditionnel (du core de SPIP ou définie par le plugin...) !
Une option complémentaire (qui avait précédé cette démarche de modélisation en table SQL), retrouvée depuis dans ce CS : offrir un générateur interactif [8] de fonctions autoriser_..() spécifique... car le CS propose déjà un fichier « mes_autorisations.php » analogue aux fichiers déjà existants (mes_options et/ou mes_fonctions), ou à celui gérable par chaque plugin.
Toutefois, le traitement des exceptions, ou des conditions indirectes (accès à la rubrique d’un administrateur restreint par exemple) devra passer par une extension de traitement utilisant le champ prévu options, avec une syntaxe adaptée, de par exemple la lame du CS... en attendant une étude plus pointue de ciautoriser !

[1Toutefois, vous trouverez des exemples de codes php à insérer dans https://www.spippourlesnuls.fr/705 et https://www.spippourlesnuls.fr/698.

[2au moyen de la fonction PHP pré-définie $arr=get_defined_functions() puis filtrage de $arr[« internal »] : voir dans outils/autorisations_action_rapide.php[23] cf http://zone.spip.org/trac/spip-zone/browser/_plugins_/couteau_suisse/outils/autorisations_action_rapide.php?rev=93315#L23

[3La fonction outils/autorisations_config.php[57] autorisations_installe_dist() compile les « autorisations maisons », saisies avec une syntaxe déclarative dans _autorisations_LISTE() créées sous forme de code php dans mes_autorisations.php.

[4Noter que le CS propose aussi une résolution pour pré-compiler les fonctions d’autorisation des divers codes php de SPIP, des plugins actifs, et des surcharges apportées, en utilisant l’invalideur SPIP.

[5Mais le paramètre attendu pourrait etre un array !?!

[6Dans certains cas, j’ai cru voir SPIP proposer une valeur négative pour l’id_auteur /dans le cas de fusions de bases ?/ : est-ce un cas particulier à prévoir, interdisant d’utiliser le méta-caractère - pour négativer des droits ? utiliser alors le  ! déjà habituel aux critères de SPIP !

[7Inspiré de *1* et *3* et d’un usage intensif des Zones d’Accès Restreint...

[8Accès réservé aux webmestres ! Et cela reprend -encore une fois- une idée déjà proposée dans le Couteau Suisse.

YannX - Mise à jour :27 avril 2023 à 10h36min