[spip-dev] API Autoriser ! ;)

Bonjour la liste…

Je repars sur une discussion que j’avais lancé il y a 8… Peut-être 10 mois ! :wink:

JE parlais entre autre de peut-être revoir le principe d’autorisation de SPIP pour pouvoir assigner des droits directement a un utilisateur…

Je n’ai pas donné de nouvelles depuis, puisque les choses étant ce qu’elles sont, parfois le temps manque… Mais bon, comme j’ai 3 projets cette automne ou cette façon de faire va être importante, je me suis lancé un peu plus a fond dans le développement de ce plugin…

J’ai pris pas mal de note au cours du développement basique et pour le moment, c’est sur le principe fonctionnel de la chose, il reste encore beaucoup a faire, mais avant d’être rendu trop loin, j’aimerais avoir votre avis sur ce qui a été fait question que j’oriente le tout le mieux possible et que si j’ai déjà des erreur grossière, je puisse déjà les corriger avant d’être rendu trop loin…

Le lien vers ma doc :

Le lien vers ce que j’ai de fait pour mon plugin :
http://www.visioninfo.qc.ca/spip_plugins/droits_autorisations/droits_et_autorisations.pdf

Ça devrait aider aussi certains a mieux visualiser ce que je voulais faire ! :slight_smile:

http://www.visioninfo.qc.ca/spip_plugins/droits_autorisations/droits_autorisations.zip

Merci ! :slight_smile:

Hello,

Beaucoup de développements (sites et plugins)
se basent sur l'implémentation actuelle des autorisations.

Est-ce que ces développements sont compatibles
ou remis en cause par ce projet ?

JLuc

Il y a une option pour demander que pour les 3 statut d'auteur de base de spip passe par le système "original"...

Également, j'essaie de faire en sorte que cela conserve sensiblement la même structure pour que cela puisse, à terme remplacer le système actuel sans trop de heurt ...

Ça fait parti de la doc et des commentaires dans les fichiers... Et je suis ouvert aux commentaires pour aider à cela ...

Je crois qu'il y aurait moyen de faire en sorte que seule une déclaration des droits utilisé par le plugin dans le nouveau pipeline acl soit nécessaire ...

Mon but n'est pas de tout casser ...

Envoyé de mon iPhone

Il y a une option pour demander que pour les 3 statut d'auteur de base de spip passe par le système "original"...

Pour mémoire, j'ai récupéré la discussion initiale du 25/10/2015 sur
Spip-dev

Également, j'essaie de faire en sorte que cela conserve sensiblement la même structure pour que cela puisse, à terme remplacer le système actuel sans trop de heurt ...

Si j'ai bien compris une remarque de Fil il suffit d'ecrire une fonction
autoriser()) qui surchargerait la fonction du core pour...

Ça fait parti de la doc et des commentaires dans les fichiers... Et je suis ouvert aux commentaires pour aider à cela ...

Je crois qu'il y aurait moyen de faire en sorte que seule une déclaration des droits utilisé par le plugin dans le nouveau pipeline acl soit nécessaire ...

Mon but n'est pas de tout casser ...

Je complète déjà un article de Carnet pour faire un peu le point des
diverses initiatives :
https://contrib.spip.net/4821

Envoyé de mon iPhone

Il y a une option pour demander que pour les 3 statut d'auteur de base de spip passe par le système "original"...

Pour mémoire, j'ai récupéré la discussion initiale du 25/10/2015 sur
Spip-dev

Également, j'essaie de faire en sorte que cela conserve sensiblement la même structure pour que cela puisse, à terme remplacer le système actuel sans trop de heurt ...

Si j'ai bien compris une remarque de Fil il suffit d'ecrire une fonction
autoriser()) qui surchargerait la fonction du core pour...

C'est ce que j'ai commencer a faire dans ce que j'ai soumis ! Et avant d'aller trop loin, c'est là que je demande des avis !!

Ça fait parti de la doc et des commentaires dans les fichiers... Et je suis ouvert aux commentaires pour aider à cela ...

Je crois qu'il y aurait moyen de faire en sorte que seule une déclaration des droits utilisé par le plugin dans le nouveau pipeline acl soit nécessaire ...

Mon but n'est pas de tout casser ...

Je complète déjà un article de Carnet pour faire un peu le point des
diverses initiatives :
Plugin ACL

J'ai regarder la plupart de ces plugins et ils ont tous à priori le même défaut, ils sont associer à un statut d'auteur pour décider de ce que la personne peut ou ne peut pas faire ...

Ce à quoi j'espère en venir, c'est d'avoir une liste des droit disponible, de pouvoir faire des groupes qui rassemble différents droits, de pouvoir assigner un ou plusieurs groupe de droit à un utilisateurs et pouvoir compléter d dans la fiche d'un utilisateur de façon granulaire ce à quoi un utilisateur a accès ou pas ...

Donc on pourrait avoir un auteur qui peut écrire des articles sans pouvoir les publier sur l'espace public, mais qui aurait aussi accès aux statistiques, à traiter des bon de commande sans voir les paiements effectuées , le tout en sélectionnant seulement les droits dans la fiche de l'utilisateur sans devoir programmer de fonctions ...

C'est mon but...

Et je crois qu'en ajoutant la déclaration des droits disponible pour chaque plugins ainsi que de la base de spip au pipeline acl on peut y arriver sans changer la façon d'utiliser la balise autoriser dans les squelettes ni la façon d'écrire des fonction supplémentaire pour valider un peut plus que juste si l'utilisateur a le droit ou pas !

On éviterais probablement l'écriture de beaucoup de fonction très basique ( les fonctions n'étant plus nécessaire à la validation des droits) tout en les conservant pour des éléments plus pointilleux !

Envoyé de mon iPhone

Il y a une option pour demander que pour les 3 statut d'auteur de base de spip passe par le système "original"...

Pour mémoire, j'ai récupéré la discussion initiale du 25/10/2015 sur
Spip-dev

Également, j'essaie de faire en sorte que cela conserve sensiblement la même structure pour que cela puisse, à terme remplacer le système actuel sans trop de heurt ...

Si j'ai bien compris une remarque de Fil il suffit d'ecrire une fonction
autoriser()) qui surchargerait la fonction du core pour...

C'est ce que j'ai commencer a faire dans ce que j'ai soumis ! Et avant d'aller trop loin, c'est là que je demande des avis !!

Ça fait parti de la doc et des commentaires dans les fichiers... Et je suis ouvert aux commentaires pour aider à cela ...

Je crois qu'il y aurait moyen de faire en sorte que seule une déclaration des droits utilisé par le plugin dans le nouveau pipeline acl soit nécessaire ...

Mon but n'est pas de tout casser ...

Je complète déjà un article de Carnet pour faire un peu le point des
diverses initiatives :
Plugin ACL

J'ai regarder la plupart de ces plugins et ils ont tous à priori le même défaut, ils sont associer à un statut d'auteur pour décider de ce que la personne peut ou ne peut pas faire ...

Accès restreint fonctionne un peu différement, en associant DES auteurs
à un nom de zone !
Et je proposais un jour de créer dans ce plugin la fonction
autoriser_zones_dist(),
qui pourrait donner lieu à la programmation assez simple de tous droits
dans les squelettes.

Ce à quoi j'espère en venir, c'est d'avoir une liste des droit disponible, de pouvoir faire des groupes qui rassemble différents droits, de pouvoir assigner un ou plusieurs groupe de droit à un utilisateurs et pouvoir compléter d dans la fiche d'un utilisateur de façon granulaire ce à quoi un utilisateur a accès ou pas ...

J'avais conçu mon ébauche d'idée (je n'en ai pas retrouvé mes docs
ecrites de l'epoque)
a peu près dans le meme objectif, et avec les caractères génériques prévus,
cela permet d'interfacer directement une gestion de groupes avec toute
autorisation spéciale.

Donc on pourrait avoir un auteur qui peut écrire des articles sans pouvoir les publier sur l'espace public, mais qui aurait aussi accès aux statistiques, à traiter des bon de commande sans voir les paiements effectuées , le tout en sélectionnant seulement les droits dans la fiche de l'utilisateur sans devoir programmer de fonctions ...

A l'inverse, pour pouvoir y associer 'tous' les droits traditionnels,
soit on les inscrit "à la mano" dans l'interface (d'ou ma réflexion d'en
reconstituer uen hiérarchie plus complète),
soit on les saisit manuellement dans la table ACL (directement inspirée
des systèmes de gestion des droits utilisés dans tous les gros
progiciels de gestion RH, FI, etc...
Le systeme de droits presente uen gestion plus facile par des zones
génériques par défaut
(en appliquant les filtrages SQL d'une manière analogue aux surcharges
SPIP d'autorisations).

Et je crois qu'en ajoutant la déclaration des droits disponible pour chaque plugins ainsi que de la base de spip au pipeline acl on peut y arriver sans changer la façon d'utiliser la balise autoriser dans les squelettes ni la façon d'écrire des fonction supplémentaire pour valider un peut plus que juste si l'utilisateur a le droit ou pas !

On éviterais probablement l'écriture de beaucoup de fonction très basique ( les fonctions n'étant plus nécessaire à la validation des droits) tout en les conservant pour des éléments plus pointilleux !

Oui /juste a bien définir le ET/OU dans la fonction core-racine
autoriser() entre les retour,
des fonctions autoriser_ traditionnelles et les calculs-fonctions
d'après la table ACL

maintenant uen gestion par table, c'est très bien, mais la multiplicité
(explosion combinatoire) oblige :
- à des valeurs par défaut (par les caractères génériques), qui seraient
introduites par le core
(ou rajoutées autoamtiquement par les plugins (en sélectionnant le nom
de plugin dans le cham "options")
- a des ecrans/squelettes d'interface plus élaborés que l'actuelle
selection d'auteurs
(déja rapidement pénible, par exemple qd on doit sélectionner a la main
tous les inscrits depuis telle année.... ;-))
mais cela ne represnete pas uen grande difficulté technique : juste
ecrire d'autres noisettes dans le privé

PS mais j'avoue n'avoir encore que "relu", et pas "etudié" ton travail.
j'ai donc certainement l'opportunité de changer d'avis

@+

Ça serait peut-être bien de commencer par la ...

A la lecture de tes réponse, une grosse partie à été écrit pour rien et ne s'applique pas du tout à ma proposition !! :wink:

Premiere reflexion : ta structure $table_des_droits me parait avoir une
vue trop restrictive et n'est pas extensible ; je dis cela en vieil
habitué des structurations de BDD (normalisation), la
sélection-firltrage peut s'opérer par SQL (donc plus rapidement, surtout
sur de grosses populations d'objets et/ou d'individus) sans avoir à
décoder l'array sérialisé "droits" ; par contre, je reprends ton idée de
"libellé" du droit pour mieux expliquer son usage (cela pourrait être
inscrit dans l'initialisation des constantes du plugin pour reprendre
les droits standard, puis étendu par un autre pipeline pour mise à
dispositon des plugins qui ne voudraient pas ecrire dans la BDD
directement !)

Cette structure de BDD, sous réserve de définir une fois dans le core
les héritages de hiérarchie entre droits, satisfait à la reprise des
fonctionnements existants, et des droits "0minirezo"....

Mais en-dehors des fonctions d'interface d'administration liant à la BDD
/et avant de relire le code/ pas d'autres changements fonctionnels ; il
reste juste a voir comment ajouter le traitement des exceptions
temporaires dans la BDD (cf. le cham "options".

Je ne comprends pas bien la Phase 1-6 "mettre en place un systeme de
fonction etendue"

En regardant quelque peu le code de SPIP et des plugins, je crois
pouvoir affirmer que le systeme d'un autoriser_bdd() que j'evoque reste
totalement compatible en co-existence avec l'existant (dès lors que les
dev-core acceptent de rajouter deux lignes dans le code de
ecrire/inc/autoriser[114] pour tester l'existence de
autoriser_bdd_dist() et le OR sur les deux resultats), y compris avec
des plugins non encore connus, ce qui repond à l'objection de JLuc.

En outre le stockage en BDD d'une table spip_acl (sur le modèle des
tables de liens déja souvent utilisé en SPIP) telle que je l'ai définie
peut parfaitement se satisfaire ensuite me semble-t-il d'une mise en
cache de fonctions d'autorisations pré-compilées pour accélerer le
systeme, ce qui eviterait donc une surchagee de la BDD à l'exploitation...

PS mais j'avoue n'avoir encore que "relu", et pas "etudié" ton travail.
j'ai donc certainement l'opportunité de changer d'avis

Ça serait peut-être bien de commencer par la ...

A la lecture de tes réponse, une grosse partie à été écrit pour rien et ne s'applique pas du tout à ma proposition !! ;).

Premiere reflexion : ta structure $table_des_droits me parait avoir une
vue trop restrictive et n'est pas extensible ; je dis cela en vieil
habitué des structurations de BDD (normalisation), la
sélection-firltrage peut s'opérer par SQL (donc plus rapidement, surtout
sur de grosses populations d'objets et/ou d'individus) sans avoir à
décoder l'array sérialisé "droits" ; par contre, je reprends ton idée de
"libellé" du droit pour mieux expliquer son usage (cela pourrait être
inscrit dans l'initialisation des constantes du plugin pour reprendre
les droits standard, puis étendu par un autre pipeline pour mise à
dispositon des plugins qui ne voudraient pas ecrire dans la BDD
directement !)

Tu parles de quelle partie ici…

Actuellement, j'ai 2 choses… J'ai le pipeline acl qui génère un array avec la liste de tout les droits disponible et le seul stockage que j'ai dans la base de données, c'est dans le nouveau champ acl qui s'ajoute a spip auteur.

Question d'éviter de faire une requête sql a chaque fois, je me suis dis qu'en mettant ça dans le champ acl, il doit y avoir moyen soit de mettre le contenu de ce champs en cache ou directement dans la balise SESSION et de le déserializer une seule fois lors du login (et par la suite, forcer la MAJ lors de la MAJ des droits)…

Actuellement, la seule chose qui s'inscrit dans la BDD, c'est vraiment les droits de chaque auteurs qui s'insère dans spip_auteurs dans le champs acl…

Donc s'il y a plus efficace que ce que je décris ci-haut, je suis ouvert… Mais si tu peux être un peu plus concret dans ta proposition de cette gestion (genre bout de code ou exemple tiré d'un autre plugin ou ….) parce que pour l'instant, je ne suis pas certain de suivre ton raisonnement…

Cette structure de BDD, sous réserve de définir une fois dans le core
les héritages de hiérarchie entre droits, satisfait à la reprise des
fonctionnements existants, et des droits "0minirezo"....

Mais en-dehors des fonctions d'interface d'administration liant à la BDD
/et avant de relire le code/ pas d'autres changements fonctionnels ; il
reste juste a voir comment ajouter le traitement des exceptions
temporaires dans la BDD (cf. le cham "options".

Parles-tu de la structure d'information qui est stocké dans le champs acl de spip_auteurs ?

Tu entends quoi par exception temporaire ?

Je ne comprends pas bien la Phase 1-6 "mettre en place un systeme de
fonction étendue"

De base, le système vérifie par exemple, si l'utilisateur a le droit "modifier_rubrique" (par exemple) … Mais je veux qu'on puisses ajouter dans l'interface des options étendue comme par exemple, si un user a des droits sur des rubriques, que l'on puisse sélectionner une ou plusieurs rubriques qu'il aura le droit de voir, modifier, supprimer (de façon unique pour chaque droit) …

Ainsi, il faut a la voir pouvoir surcharger le formulaire d'édition des droits pour que si le droit "voir_rubrique" est sélectionné, un élément de l'interface va permettre de sélectionner une ou plusieurs rubrique qui sera assigné au droit, et également, les fonctions qui effectueront la validation au de la de simplement posséder le droit pour s'assurer que la rubrique fait bien partie de celle qu'il a le droit de voir/modifier/supprimer…

Dans 90% des cas, je crois que le simple fait que le droit soit sélectionné sera suffisant mais le 10% de cas particulier est très important a gérer…

En regardant quelque peu le code de SPIP et des plugins, je crois
pouvoir affirmer que le systeme d'un autoriser_bdd() que j'evoque reste
totalement compatible en co-existence avec l'existant (dès lors que les
dev-core acceptent de rajouter deux lignes dans le code de
ecrire/inc/autoriser[114] pour tester l'existence de
autoriser_bdd_dist() et le OR sur les deux resultats), y compris avec
des plugins non encore connus, ce qui repond à l'objection de JLuc.

Ici, j'ai rien compris……

En outre le stockage en BDD d'une table spip_acl (sur le modèle des
tables de liens déja souvent utilisé en SPIP) telle que je l'ai définie
peut parfaitement se satisfaire ensuite me semble-t-il d'une mise en
cache de fonctions d'autorisations pré-compilées pour accélerer le
systeme, ce qui eviterait donc une surchagee de la BDD à l'exploitation…

Tu parles ici d'avoir une table acl plutôt que le pipeline pour avoir la liste de tout les droits ou tu verrais une table acl pour gérer les droits associé aux utilisateur pour gérer leur droits individuel et avoir plus de souplesse pour gérer les ajouts ???

Hello

Tu écris sur spip-dev donc j'imagine que tu imagines une intégration
de ton projet au core de SPIP.
Mais les autorisations sont très proches du coeur de spip
et elles semblent satisfaire les actuels développeurs de SPIP.

Donc à moins d'un miracle de technologie et de fonctionnalités qui les fasse tous se pâmer,
il ne faut pas espérer sérieusement que tes développements soient intégrés à court terme au core de SPIP
(et pour le long terme, il faudrait déjà voir quelque chose qui fonctionne bien).

Le mieux serait que tu développes ton projet sous la forme d'un plugin,
quitte à surcharger des fichiers du core
et que tu le proposes sur la zone et que tu en documents l'usage sur contrib.spip.net
afin qu'il soit testé et débuggué et ses intérêts validés et développés.

Bonne chance et bons codes,
JLuc

Je comprends… Je vais voir comment faire progresser tout ça…

En attendant… ON m’a déjà créer un code d’accès au SVN pour pouvoir pousser mon plugin…

Mais question de pouvoir présenter mon plugin sur contrib, d’avoir un emplacement pour recevoir les avis, les suivit de développement, les bug track, etc… Est-ce que SPIP a des ressources pour ça ? Je sais que oui parce que j’ai déjà soumis des choses, mais je sais pas a quel point c’est ouvert “At Large” ou si c’est juste pour les dev du core…

Si c’est ouvert at large, est-ce qu’il y a un emplacement ou je peux avoir les infos sur quels ressource sert a quoi, et les bonnes pratiques pour bien les utiliser …

Je veux bien intégrer tout ça a l’univers spip, mais il me manque des infos pour le faire correctement… :wink:

Il y a a peu près tout ici, il me semble, en tout cas le principal :
http://plugins.spip.net/distribuer-une-contribution.html

Hello David,

En complément à RastaPopoulos Le 31/08/2016 à 14:27 qui écrivait :

Distribuer une contribution - Plugins SPIP

Je sais pas ce que tu veux dire avec "at large" mais en bref :
oui tu es chaleureusement invité à utiliser les ressources partagées et mises à disposition,
et notamment
SVN de spip-zone pour l'hébergement du source, le versioning et le dev collaboratif,
contrib.spip.net et plugins.spip.net pour la doc et la mise à disposition du plugin,
liste spip-zone pour les discussions sur l'usage et le dev ton plugin (bugs, demandes d'aide, etc)
(et non spip-dev, qui est réservé au core)
Il y a aussi le carnet spip (wiki sur contrib.spip) pour partager des réflexions ou des docs non abouties ou collaboratives.

contrib.spip est ouvert aux inscriptions comme tout site spip normal paramétré pour.
Pour commiter sur svn il faut d'abord t'inscrire sur la liste spip-zone
et y demander un identifiant svn.

Pour diffuser le plugin sur plugin.spip il faudra le mettre dans l'archivelist
comme le lien de rastapopoulos ne doit pas manquer de l'expliquer.

JL

Hello David,

bravo et merci pour tous ces efforts et cette piste d'évolution.
Sur le fond je souhaite quand même attirer ton attention sur un point :

les fonctions d'autorisation existante ne sont pas simplement des fonctions de vérification de droit lié à l'auteur connecté, mais aussi/surtout (selon les cas) des fonctions qui intègrent la logique métier propre à SPIP.

Par exemple :

La previsu liée à un token :
https://core.spip.net/projects/spip/repository/entry/spip/ecrire/inc/autoriser.php#L292

La traduction
https://core.spip.net/projects/spip/repository/entry/spip/ecrire/inc/autoriser.php#L398

Le datage d'un objet
https://core.spip.net/projects/spip/repository/entry/spip/ecrire/inc/autoriser.php#L466

La suppression d'une rubrique
https://core.spip.net/projects/spip/repository/entry/spip/ecrire/inc/autoriser.php#L614

etc etc (je n'ai regardé que les premières fonctions du fichier).

La solution que tu décris ne peut donc pas remplacer brutalement les fonctions existantes sauf à perdre totalement cette logique métier.

Peut-être serait-il possible de faire un plugin fonctionnel avec un peu d'astuce en surchargeant la fonction autoriser() point d'entrée de l'API pour prendre la main qui ferait :
- vérification des droits de l'utilisateur via ta couche ACL
- upgrade temporaire des droits de l'utilisateur courant comme webmestre (on fake le 'qui' de autoriser)
- appel de la fonction autoriser via mécanisme de autoriser_dist actuel, qui normalement ne devrait pas buter sur un refus lié au faux 'qui' webmestre, mais uniquement se baser sur les règles métiers pour autoriser/refuser le droit
- faire un ET entre les 2 autorisations et retourner le résultat

C'est un petit bricolage et il n'est pas certain que ça fonctionne totalement. Je pense à certains droits qui seraient reservés aux visiteurs, au rédacteurs ou aux admins restreints, c'est en théorie possible qu'il y en ait mais j'ai pas d'exemple précis en tête. Il faudra traiter ces cas là au coup par coup en fonction des retours de bug.

Si on voit plus loin pour une éventuelle intégration propre, il faudrait commencer par découper les fonctions autoriser en 2 en séparant la partie métier de la partie ACL, pour pouvoir ensuite remplacer la partie ACL par ta proposition d'évolution (que ce soit en plugin ou directement dans le core ne change rien).

C'est clairement une évolution assez majeure à réfléchir murement. Si on s'y prend bien pour que ce soit une structuration possible mais non obligatoire qui continue de fonctionner avec l'existant, ce peut-être quelque chose qu'on introduirait dans la 3.2 (la découpe en 2 couches).
Il faudra ensuite qu'elle soit releasée, puis que ce découpage soit propagé dans tous les plugins importants (ou concernés).

Tout ça est donc à l'échelle de mois, voir d'années avant qu'une migration vers ta solution d'ACL soit intégrable de manière robuste et satisfaisante.
Voilà pour les enjeux et pour mes réflexions sur le sujet.
A te lire