Autorisations PHP pour les Auteurs

  avec des exemples de code PHP (extraits de SPIP)

Pour protéger l’accès aux contenus, plusieurs pages du Web rappellent le fonctionnement des Autorisations dans SPIP.

Mais ...... c’est du code PHP : pas évident de s’autoriser à écrire des fonctions pour l’autoriser !

Alors, si Les autorisations basiques ne suffit pas, il suffit par exemple de retrouver ce bout de code écrit par un spipeur.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 Le problème d’origine

Lorsqu’on autorise l’accès du back-office à des auteurs déclarés comme simples rédacteurs, ceux-ci peuvent alors accéder à toutes les informations des autres auteurs du site (en particulier déjà à leur e-mail, ce qui constitue une première indiscrétion).
De plus, si le site utilise aussi le plugin Coordonnées, l’interface privée donne possibilité de consulter toutes les données personnelles enregistrées : adresse, téléphone, etc ......

 Principe de solution

A ce jour d’avant 11 Novembre, la solution mise en commun est construite sur le principe montré ci-dessous (tout en restant incomplète et imparfaite [1], voir ci-dessous.

On rajoutera un code source définissant des autorisations, inspiré du code ci-dessous proposé par MisterGraphX dans l’inclure du fichier mes_fonctions pour masquer certains éléments de menu back-office.

Dans un premier temps, seul le code originel -qui ne répond pas au même besoin : à adapter- reste publié ici pour mémoire, en espérant que les commentaires du source vous suffiront !

  1. // A placer dans mes_options
  2. //  Masquer des entrée du menu de l'espace privé à des Admins NON webmestre
  3. //  https://contrib.spip.net/Autorisations-Dans-Spip#nh2
  4. //  API autoriser : https://www.spip.net/fr_article5528.html
  5. //  Autorisation des items de premier niveau du bandeau
  6. // https://code.spip.net/autodoc/tree/ecrire/inc/autoriser.php.html#function_autoriser_menugrandeentree_dist
  7. function autoriser_menugrandeentree($faire, $type, $id, $qui, $opt) {
  8.                 // var_dump('faire: ' .$faire . ' - type: ' .$type.' - QUI ? '.print_r($qui,1));
  9.                 if (isset($type)) {
  10.                         if($type == 'menupublication'
  11.                                 || $type == 'menuactivite'
  12.                                 || $type == 'menuconfiguration'
  13.                                 ){
  14.                                         return $qui['statut'] == '0minirezo' AND $qui['webmestre'] == 'oui';
  15.                         }
  16.  
  17.                 }
  18.                 return $qui['statut'] == '0minirezo';
  19. }
  20.  
  21. function autoriser_auteurs_menu($faire, $type, $id, $qui, $opt) {
  22.     return $qui['statut'] == '0minirezo' AND $qui['webmestre'] == 'oui';
  23. }
  24.  
  25. function autoriser_compositions_menu($faire, $type, $id, $qui, $opt) {
  26.     return $qui['statut'] == '0minirezo' AND $qui['webmestre'] == 'oui';
  27. }
  28.  
  29. function autoriser_mediabox_menu($faire, $type, $id, $qui, $opt) {
  30.     return $qui['statut'] == '0minirezo' AND $qui['webmestre'] == 'oui';
  31. }

Télécharger

L’exemple ci-dessus est enregistré pour mémoire, car il est issu d’un dialogue sur le canal IRC et sur la liste....
En résultats recherchés, on masque certains choix de menus dans l’interface privée [2]...

 Solution intermédiaire

Par exemple, dans l’implantation voulue [3] le rédacteur ne peut plus accéder aux autres fiches par ./ecrire/?exec=auteur&id_auteur=xx

Ainsi, voici la surcharge de fonction d’autorisation à opérer pour masquer la fiche auteur :

  1. // Pour voir une fiche auteur : être admin ou bien il s'agit de sa
  2. propre fiche
  3. function autoriser_auteur_voir($faire, $type, $id, $qui, $opt) {
  4.          if (
  5.                  ($qui['statut'] == '0minirezo')
  6.                  or ($qui['id_auteur'] == $id)
  7.          ) {
  8.                  return true;
  9.          }
  10.          else return false;
  11. }

Télécharger

Du coup, il est possible de faire une fonction de camouflage de l’email (ci-dessous), que vous pourriez utiliser comme filtre complémentaire dans vos squelettes [4] :

  1. // masquer un email si on est pas autorisé
  2. function camoufler_email($email,$id) {
  3.          include_spip('inc/autoriser');
  4.          // on camoufle sauf autorisation
  5.          if (!autoriser('voir','auteur', $id)) {
  6.                  $email = spip_substr($email,0,3) . "*****";
  7.          }
  8.      return $email;
  9. }

Télécharger

Mais ! Tout rédacteur a toujours la vision des adresses mails via la page ./ecrire/?exec=auteurs

Une solution simple (que vous trouveriez en relançant avec le paramètre ./ecrire/?exec=auteurs&var_mode=inclure) : surcharger la noisette correspondante des squelettes du privé (organisés sous Z) !

Il vous suffira donc de rajouter un test de statut sur la ligne correspondante en

  1. ../squelettes/prive/objets/liste/auteurs.html[50]
  2. _ <td class='email'>[(#SESSION{statut}|=={0minirezo}|oui)[<a href='mailto:(#EMAIL)'>[(#EMAIL|couper{30})]</a>]]</td>

Télécharger

 Modifications autorisées aux auteurs

Enfin, un exemple complétant les autorisations à leurs auteurs pour la modification des articles (ou autres objets) déjà publiés [5]

  1. // tous les auteurs associés à un objet article sont autorisé à le modifier (même si l'objet est publié)
  2. function autoriser_article_modifier($faire, $type, $id, $qui, $opt) {
  3.     if (!isset($qui['statut']) OR !in_array($qui['statut'], array('0minirezo', '1comite')))
  4.         return false;
  5.     if ($qui['statut'] == '0minirezo')
  6.         return true;
  7.        
  8.     $T_auteurs = sql_allfetsel('id_auteur','spip_auteurs_liens', array('id_objet='.$id, 'objet="article"'));
  9.     $T_auteurs = array_column($T_auteurs,'id_auteur');
  10.     return in_array($qui['id_auteur'], $T_auteurs);
  11. }

Télécharger


Merci de nous signaler les coquilles ou erreurs qui figureraient dans cette page.

[1Les Liens d’accès sont masqués dans l’interface, mais ce n’est pas parce qu’un lien n’est pas directement visible, qu’il est
inaccessible.

[2Le code ci-dessus masque d’autres choix, attention !

[3Qui sera fournie ultérieurement /merci SpipFactory

[4Il serait peut-etre plus "politiquement correct dans l’esprit SPIP" de transformer la fonction en surcharge de la balise #EMAIL d’origine, ou au moins comme balise logique (c’est-a-dire fonctionnant comme un #REM conditionnel)

[5Pour Crayons, ou donne une alternative au plugin Nouvelle Version !


Liens A2A visibles seulement pour les inscrits.
Liens visibles seulement pour les inscrits.

Article publié le 8 novembre 2018, et actualisé en janvier 2019 .

Répondre à cet article