La question de la gestion des droits d’accès tant dans l’interface privée que publique revient régulièrement dans plusieurs listes de discussions. Plusieurs contribs proposent déjà différentes solutions. Alors pourquoi une autre ?
La presque totalité d’entre elles propose de contrôler l’accès à un article ou à une rubrique dans l’interface publique mais pas dans l’interface privée.
De plus, on limite normalement l’accès à la totalité d’une page et non pas à une partie.
Pour offrir une version différente d’une page selon le statut de l’internaute, il faut souvent créer plusieurs pages.
Plusieurs demandent la création et l’ajout à vos pages existantes de nouveaux mots-clés.
Elles impliquent également plusieurs modifications à vos squelettes.
Cette contrib ne demande aucune modification à vos squelettes actuels ni aucune modification au coeur de SPIP.
Elle permet d’afficher, tant dans l’interface privée que publique, n’importe où à l’intérieur de vos textes, un contenu différent selon le statut de l’internaute par l’utilisation de tags au moment de la rédaction de vos textes et ce, sans mot-clé.
Ce sont les tags
Comment ça marche ?
Les tags <statut></statut>
ou « bloc statut » sont librement inspirés des tags ou « bloc multi » <multi></multi>
de SPIP. Ils permettent d’afficher, tant dans l’espace privé que public, des contenus différents selon le statut de l’internaute.
On peut utiliser ces tags dans :
- les articles [1]
- les rubriques [2]
- les brèves [3]
- les auteurs [4]
- les sites référencés [5]
Exemple d’utilisation du « bloc statut » :
<statut>
[ad]
Les Administrateurs identifiés seront les seuls à voir ce texte dans l'interface privée et publique.
[re]
Les rédacteurs identifiés seront les seuls à voir ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
[vi]
Les Visiteurs identifiés seront les seuls à voir ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
[pu]
Les personnes non identifiés verront ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
</statut>
Deux possibilités d’affichage pour l’administrateur dans l’interface privée
- Afficher seulement la version réservée aux administrateurs. Si elle n’existe pas, afficher la version réservée aux Rédacteurs. Si elle n’existe pas, afficher la version réservée aux Visiteurs.
- Afficher toutes les versions. Si elle existe, afficher la version réservée aux Administrateurs. Si elle existe, afficher la version réservée aux Rédacteurs. Si elle existe, afficher la version réservée aux Visiteurs pour l’interface publique. Si elle existe, afficher la version pour les personnes non identifiées pour l’interface publique.
Une seule possibilité pour le rédacteur dans l’interface privée
Si elle existe, afficher la version réservée aux Rédacteurs. Si elle n’existe pas, afficher la version réservée aux Visiteurs. Si elle n’existe pas, afficher la version pour les personnes non identifiées pour l’interface publique.
Si elle n’existe pas, ne rien afficher.
Chaque version est identifiée dans l’interface privée par les mêmes icônes qui identifient le statut des auteurs.
Pour la version publique, on a choisi le +.
Et dans l’interface publique ?
Les partie de texte contenues dans le « bloc statut » ne seront affichées dans l’interface publique que pour les personnes ayant le statut requis.
Où peut-on utiliser le « bloc statut » ?
Le « bloc statut » peut être utilisé partout où est utilisable actuellement le « bloc multi »
Qui peut avoir besoin du « bloc statut » ?
Ses particularités peuvent répondre aux besoins de certains sites qui désirent limiter l’accessibilité de certaines informations aux seuls administrateurs du site dans l’interface d’administration. En effet, ceci n’est pas encore possible, même avec la nouvelle version 1.8.2.
Imaginons un site corporatif qui veut ouvrir l’espace de rédaction de son site SPIP à des consultants extérieurs, sans leur révéler certaines listes de prix ou contacts. L’auteur administrateur n’aura qu’à mettre l’information entre tags <statut>[ad]...</statut>
pour en limiter l’accès aux administrateurs identifiés même dans l’espace privé.
Procédures
Option 1 :
- Téléchargez le fichier mes_options.php3.txt
- Copiez et collez son contenu dans votre fichier mes_options.php3 dans le dossier ecrire s’il existe déjà.
- Sinon, copiez et collez le ficher dans le dossier ecrire et renommez-le fichier en supprimant l’extension .txt (mes_options.php3) .
- Téléchargez le fichier mes_fontions.php3.txt
- Copiez et collez son contenu dans votre ficher mes_fonctions.php3 à la racine de votre site spip s’il existe déjà.
- Sinon, copiez et collez le ficher à la racine de votre site spip et renommez-le fichier en supprimant l’extension .txt (mes_fonctions.php3) .
Option 2 :
Suivez l’explication des modifications suivantes et modifiez vous-même les fichiers déjà en place sur votre site.
Explications des modifications
Nous allons créer un jeu de fonctions directement inspiré de celui permettant d’utiliser les tags
où on remplacera la vérification de la langue par la vérification du statut de l’internaute.
Fichier mes_options.php3 (dossier ecrire)
function avant_propre($texte) {
return extraire_statut($texte);
}
function multi_statut ($trads) {
// Donner la valeur 1 à la variable $affiche_tout pour permettre aux administrateurs de voir dans l'interface privée toutes les versions.
// Donner la valeur 0 à la variable $affiche_tout pour permettre aux administrateurs de voir dans l'interface privée toute la même version
// qu'il verront dans l'interface publique
$affiche_tout=1;
global $id_rubrique;
$image = 'visit-12.gif';
$statut = $GLOBALS['auteur_session']['statut'];
// S'il n'y a aucun texte spécifique pour les visiteurs, afficher pour les visiteurs le texte par défaut
if ($trads['vi']=='')$trads['vi']=$trads['pu'];
// S'il n'y a aucun texte spécifique pour les rédacteurs, afficher pour les rédacteurs le texte le texte des visiteurs
if ($trads['re']==''){
$trads['re']=$trads['vi'];
}else{
$image = 'redac-12.gif';
}
// S'il n'y a aucun texte spécifique pour les administrateurs, afficher pour les administrateurs le texte le texte des rédacteurs
if ($trads['ad']==''){
$trads['ad']=$trads['re'];
}else{
$image = 'admin-12.gif';
}
switch ($statut) {
case '0minirezo':
$statut='ad';
if ($trads[$statut]!='')
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
break;
case '1comite':
$statut='re';
if (isset($trads[$statut])&&strlen($trads[$statut])!=''){
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}
break;
case '6forum':
$statut='vi';
break;
default:
$statut='pu';
break;
}
if (isset($trads[$statut])) {
// dans l'espace prive, mettre une image admin
if (!_DIR_RESTREINT) {
if($statut=='ad'&&$affiche_tout){
if ($trads['ad']!=''&&$trads['ad']!=$trads['re']){
$image = 'admin-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
$retour = $afficher.$trads['ad'].$afficher;
}
if ($trads['re']!=''&&$trads['re']!=$trads['vi']){
$image = 'redac-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
$retour .= '<br />'.$afficher.$trads['re'].$afficher;
}
if ($trads['vi']!=''&&$trads['vi']!=$trads['pu']){
$image = 'visit-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
$retour .= '<br />'.$afficher.$trads['vi'].$afficher;
}
if ($trads['pu']!=''){
$image = 'plus.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
$retour .= '<br />'.$afficher.$trads['pu'].$afficher;
}
return $retour;
}
if ($statut=='ad'&&$trads['ad']!=''&&$trads['ad']!=$trads['re']){
$image = 'admin-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}else if ($trads['re']!=''&&$trads['re']!=$trads['vi']&&$trads['re']!=$trads['pu']){
$image = 'redac-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}else if ($trads['vi']!=''&&$trads['vi']!=$trads['pu']){
$image = 'visit-12.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}
else if ($trads['pu']!=''){
$image = 'plus.gif';
$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
}
return $afficher.$trads[$statut].$afficher;
}
return $trads[$statut];
}
else if (ereg('^([a-z]+)_', $statut, $regs) AND isset($trads[$regs[1]])) {
return $trads[$regs[1]];
}
else return array_shift($trads);
}
// analyse un bloc statut
function analyse_statut ($bloc) {
$statut = 'pu';
// Créer par défaut un tableau avec des valeurs vides
$trads= array('','pu'=>'','ad'=>'','re'=>'','vi'=>'');
while (preg_match("/^(.*?)[{\[]([a-z_]+)[}\]]/si", $bloc, $regs)) {
//while (preg_match("/^(.*?)[\[]([a-z_]+)[\]]/si", $bloc, $regs)){//http://permalink.gmane.org/gmane.comp.web.spip.devel/29558
$texte = trim($regs[1]);
if ($texte OR $statut)
$trads[$statut] = $texte;
$bloc = substr($bloc, strlen($regs[0]));
$statut = $regs[2];
}
$trads[$statut] = $bloc;
return multi_statut($trads);
}
// repere les blocs statut dans un texte et extrait le bon
function extraire_statut ($letexte) {
if (strpos($letexte, '<statut>') === false) return $letexte; // perf
if (preg_match_all("@<statut>(.*?)</statut>@s", $letexte, $regs, PREG_SET_ORDER))
foreach ($regs as $reg)
$letexte = str_replace($reg[0], analyse_statut($reg[1]), $letexte);
return $letexte;
}
Pour conserver dans le système cache des versions différentes selon le statut de l’internaute, on ajoute dans l’url de la page la variable statut en saisissant automatiquement la valeur dans la variable $GLOBALS[’auteur_session’][’statut’]) .
Il est impossible de passer manuellement une valeur erronnée. Merci à Mortimer pour cette astuce.
Fichier mes_fonctions.php3 [6]
if((!isset($_GET['statut'])&&isset($GLOBALS['auteur_session']['statut']))||addslashes($_GET['statut']) != $GLOBALS['auteur_session']['statut']){
$link = $GLOBALS['clean_link'];
$link->delvar('statut');
$link->addvar('statut',$GLOBALS['auteur_session']['statut']);
redirige_par_entete($link->getUrl());
}
À vous de jouer !
Merci de nous aider à améliorer cette contrib en nous signalant toute amélioration possible dans le code ou dans nos explications.
Discussions par date d’activité
6 discussions
Très bonne contribution notamment si on l’intègre au plugin balise_session comme je l’ai fait en modifiant la contribution originale.
Répondre à ce message
[ad]
Les Administrateurs identifiés seront les seuls à voir ce texte dans l’interface privée et publique.
Je viens d’installer cette contrib et de mettre le tag status ci dessus dans le champs texte d’une rubrique de test.
On voit à partir du site public (donc sans login) la rubrique et son contenu.
Si vous pouviez m’éclairer parce que là je suis dubitatif
Tu n’aurais pas oublié de te déconnecter après avoir publié l’article ? As-tu testé avec
Si tu ne vois que la partie pour l’administrateur dans l’espace public, c’est que tu étais toujours connecté comme administrateur.
Donne-moi en des nouvelles.
Est-ce dans la page sommaire.php3 dans l’introduction à l’article ( balise #INTRODUCTION) ?
Voilà des nouvelles.
Je pense que je n’avais pâs bien saisi le sens de cette contrib.En fait ce que je veux c’est qu’une rubrique n’apparaisse pas du tout sur le site publique si elle est réservé au admin et au rédacteur.Le pb c’est qu’avec ta solution les personneS ne devant pas avoir accés à la rubrique voient quand même qu’elle existe et je trouve que c’est de nature à créer le malaise. me trompe je ?
En fait j’aimerai que certaines rubriques soient exploitées par certains administrateurs et rédacteurs sans qu’ils puissent intervenir sur les rubriques qui ne les concernent pas.En suite l’idéal serait (pour moi) de ne rendre visibles que certaines rubrique à certains visiteurs.
Je me demande quelle est la meilleures solution pour obtenir coté admin et rédacteur le résultat que propose l’addon XPROTECTOR.
Bonjour,
Je continu à tester ta contrib et je me suis apercu que si un admin met une restriction de visibilité sur, par exemple le texte d’une rubrique qui était jusque la visible, et qu’il ne prend pas soin de recalculer la page correspondante ou de vider le cache, le visiteur voit quand même la version qui est dans le cache et qui contient le texte visible avant la restriction.
Est ce que tu as aussi constaté ça ?
Cordialement,
Serge
Oui, c’est normal. On doit récalculer la page pour remplacer celle-ci dans le cache.
J’ai également ce besoin. Ç’est plus de l’ordre de la contrib Comment restreindre l’accès d’un article ou d’une rubrique dans l’interface publique par le statut.
Je t’invite à en discuter sur cette autre contrib. Mais si je comprends bien,
ton besoin serait de combiner cette autre contrib avec une fonction que je n’ai pas encore documentée et qui applique la visibilité par statut également dans l’interface privée.
Je n’ai jamais utilisé XPROTECTOR.
Je veux rester TOUT SPIP dans la mesure du possible et j’y arrive pour le moment.
Bonjour je souhaiterais restreindre des rubriques dans l’espace privé pour que les rédacteurs n’écrivent pas des articles n’importe où...
Comment faire ?
Ou mettre les tags statut ?
Merci d’avance
Répondre à ce message
Bonjour je souhaiterais savoir si la Restriction de contenu dans l’espace public et privé par le « bloc statut »
est possible avec la version multispip version 1.6 ?
mercci de de bien voulloir me répondre.
Pat2
Répondre à ce message
J’ai installé sur un site en local (squelette sarka) les deux contribs :
- Restriction de contenu dans l’espace public et privé par le « bloc statut »
et
- Comment restreindre l’accès d’un article ou d’une rubrique dans l’interface publique par le statut.
Je crée une rubrique avec le mot-clé administrateur et à l’intérieur un article (pas de mot-clé) contenant ce texte :
Depuis la partie publique (cache vidé dans spip et du navigateur, cookie supprimé, déconnecté) :
- si j’essaie d’accèder à la rubrique en suivant l’arborescence, pas de souci, je vais sur spip-login ou on me demande une oidentification.
- mais dans les « derniers articles publiés » de ma page d’accueil, j’ai un article contenant ceci :
"Informations générales
[pu] Des informations publiques sur la vie du collège. [re]Des informations complémentaires visibles par l’ensemble des rédacteurs, profs et élèves [ad] Ces informations ne sont visibles que des administrateurs du site.
lire la suite de l’article « - si je clique sur »Lire la suite« , j’ai bien ceci : »Des informations publiques sur la vie du collège. "
DONC, y a comme un truc qui a du m’échapper !!??
merci d’un coup de main.
Le problème vient de la fonction couper_intro() utilisée dans le calcule de la balise #INTRODUCTION.
On pourrait la modifier ou, plus propre, surcharger la fonction de calcule de cette balise en ajoutant le code suivant dans le fichier mes_fonctions.php3
Ça devrait aller !
Répondre à ce message
Bonjour,
Cette contrib est-elle compatible avec votre autre contrib du 20/10 ? :Comment restreindre l’accès d’un article ou d’une rubrique dans l’interface publique par le statut.
20 octobre 2005 Iago
Si non laquelle est la meilleure ?
Cordialement
Oui, elles sont compatibles. Avec la contrib Comment restreindre l’accès d’un article ou d’une rubrique dans l’interface publique par le statut. tu pourrais, par exemple, limiter l’accès à un article aux personnes qui se sont identifiées ( administrateur, rédacteur ou visiteur ) et dans cette article, choisir d’afficher, en partie ou en totalité, un texte différent pour chacun des statuts.
Répondre à ce message
le bloc statut fonctionne-t-il dans un squelette, peut-on écrire
ou mieux
en tout cas, ça marche bien dans le corps de l’article
Son comportement est semblable aux blocs multi. Comme pour eux, ce n’est pas possible. En gros, la fonction, appellée par la fonction avant_propre(), est prise en compte dans les espaces texte et pas de le reste du squelette.
Il faudrait concocter un autre fonction pour ça.
Personnellement, j’ai déjà une fonction pour gérer l’affichage en fonction du statut dans les squelettes mais lié à un mot clé. Je l’utilise pour afficher ou non les titres des rubriques et des articles, par exemple, dans les menus selon le statut de l’internaute. Je ne veux pas qu’une rubrique dont il n’a pas l’accès soit visible, même dans le plan, si l’internaute ne peut la visiter. Ça évite des frustrations.
Avec quelques modifications, ça pourrait faire l’affaire... Mais ce serait une autre histoire ( une autre contrib...).
Bonjour,
Cette fonction m’intéresse bigrement. A quand la contribution ?
Cordialement
Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |