< Créer une zone privée avec SPIP >
Nicolas a posté dans la liste spip-dev un message expliquant comment créer une partie privée sur un site spip : en utilisant les mots clés, une bien bonne idée.
Bonjour,
Je suis en train de développer un site sous SPIP, avec deux niveaux d’accès au contenu :
public : peut seulement consulter une partie du site
privé : peut consulter tout le site spip
Pour cela, j’associe à chaque élément (rubrique, article, brève...) un mot-clé : soit ’public’, soit ’privé’.
Puis je fais pour chaque squelette :
une version privée, par ex. rubrique-prive.html, avec des boucles tout ce qu’il y a de plus normal (les utilisateurs peuvent donc tout consulter)
une version publique, par ex. rubrique-public.html, avec des boucles qui limitent l’accès aux seuls éléments contenant le mot-clé ’public’
Il suffit donc ensuite, en fonction de l’utilisateur connecté, de déclencher l’utilisation d’un squelette ou de l’autre. Par exemple, mon rubrique.php3 ressemble à ceci :
(note bien que la gestion des utilisateurs web est distincte de la gestion des utilisateurs SPIP, pour mon cas je le fais avec des sessions PHP4 et une base MySQL)
$s = new Session();
$fond = "rubrique";
$delais = 2 * 3600;
if ($s->matchRole("ACCES_WEB_PRIVE")) {
$fond .= "-mineur";
} else if ($s->matchRole("ACCES_WEB_PUBLIC")) {
$fond .= "-public";
}
include ("inc-public.php3"); ?>
Jusqu’ici tout va bien, sauf que le cache de SPIP se met à cafouiller : par exemple, si une page est calculée sous le profil ’accès privé’ et qu’un utilisateur ’public’ essaie d’accéder à la même page, SPIP renvoie la page cachée (contenant donc des infos ’privé’)... il faut donc légèrement modifier le fichier inc-public-global.php3 :
(note : j’en profite pour virer aussi l’id de session, sinon SPIP calcule une page différente pour chaque nouvel id de session... ça fonctionne quand même mais le cache ne sert plus à rien)
// Gestion du cache et calcul de la page
//
$fichier_requete = $REQUEST_URI;
$fichier_requete = strtr($fichier_requete, '?', '&');
$fichier_requete =
eregi_replace('&(submit|valider|(var_[^=&]*)|recalcul)=[^&]*', '',
$fichier_requete);
// Addition Nicolas : supprimer l'id de session éventuel
// et cacher les différentes versions de la page en fonction du type d'accès
$fichier_requete = eregi_replace('[&?]PHPSESSID=[^&]*', '',
$fichier_requete);
$fichier_requete = $fichier_requete."_".$fond;
// -- fin addition Nicolas
$fichier_cache = generer_nom_fichier_cache($fichier_requete);
$chemin_cache = "CACHE/".$fichier_cache;
Et voilà ! Tu peut maintenant gérer un couple de squelettes (voire plus, j’ai pas essayé mais cela doit marcher aussi) en fonction des droits d’accès. Ca fonctionne parfaitement sur mon site de test, et la gestion des droits est très simple dans l’admin SPIP : il suffit d’affecter un mot-clé ’public’ ou ’privé’, et c’est tout. Le côté pénible c’est la duplication des squelettes, mais il suffit en général de faire l’un, de copier-coller et de modifier les paramètres des boucles dans l’autre.
En espérant t’avoir aidé dans la réalisation de la quête du grand serpent de mer de la gestion des droits d’accès aux contenus SPIP,
Très cordialement,
14 commentaires
C’est vrai que la solution présentée par le webmaster de allergique.org est plus simple.
Cependant, l’utilisation de deux squelettes bien distincts pour la partie publique et la partie privée du www.rimn.org, permet de cacher complètement les contenus privés (y compris aux moteurs de recherche), l’avantage étant qu’il n’y a donc jamais de liens qui pointent vers une page ’interdite’.
Evidemment, il faut alors maintenir les squelettes en double... c’est un peu plus lourd.
Bonjour,
Une question vraiment neuneu. J’ai honte mais ne sachant pas programmer je me demandais ce qu’était session.php. Enfin, c’est mon ordinateur qui me le demande : Fatal error : Failed opening required ’Session.php’ (include_path=’. ;C :\Program Files\EasyPHP\php\pear\’) in c :\programfiles\easyphp\www\......
Merci de tout aide
Les sessions php sont souvent utilisées pour associer des variables à un visiteur (ou plus précisément, à une visite).
Si tu fais tourner SPIP en local sur ton ordinateur, et que tu as ce message d’erreur, j’imagine que php est mal configuré, et qu’il n’arrive pas à créer le fichier dans lequel il stocke tes variables de sessions.
Il se peut tout à fait que ce message d’erreur n’apparaisse plus une fois que tu auras envoyé ton site spip sur un serveur classique.
Bonjour,
Apparemment : < ? require_once("Session.php") ; indique qu’il y a un fichier à charger. J’aimerai bien savoir comment est rédigé ce ficher car je ne sais pas programmé. MERCI de ton commentaire.
Je vais pas pouvoir t’aider n’ayant jamais utilisé les sessions de php. J’ai lu pas mal de truc sur les sessions et pas mal de personnes ont des problèmes avec, donc je me suis toujours bidouillé mon petit système à moi plutôt que d’utiliser les fonctions internes à PHP (c’est sans doute idiot de ma part).
Bonne chance à toi, c’est tout ce que je peux te souhaiter.
Ce fichier contient le code de gestion des session. Tu trouveras plus de détails sur ce sujet dans le manuel PHP :
http://www.php.net/manual/en/ref.se...
Tu n’es cependant pas obligé d’utiliser les sessions. N’importe quel moyen d’authentification des utilisateurs peut convenir (cookies, etc.), pour déterminer si, oui on non, le profil de l’utilisateur est "public" ou "privé". Un minimum de programmation est toutefois nécessaire. Bon courage !
Et bonne année !
Je recherche un moyen de créer un espace privé sous spip qui fonctionne correctement et qui soit bien expliqué. Qui peut m’aider ?
Je suis un peu dans le meme cas. Grace à eva, je me suis fabriqué un album web très sympa, mais maintenant, j’aimerai le mettre en ligne, pour que mes proches (et uniquement mes proches ! ! !) puissent le consulter. Je débute en spip, mais suis une pipe (jeu de mot :) ) en programmation. Si quelqu’un avait des astuces pour ce problême d’identification (ou du code que je puisse tester), je suis preneur.
Amicalement. Géronimo.
Même souci pour moi : après avoir essayé Phpsecure qui me posais des pbs que je n’ai pas réussi à résoudre, j’ai trouvé Xprotector :
http://xprotector.sourceforge.net/
Ca fonctionne bien sur mon site hébergé par apinc.org, mais pas sur celui qui est sur online.fr.
Autre pb, si la rubrique est bien sécurisée (j’ai antidaté les articles pour qu’ils n’apparaissent pas sur la page d’accueil, date de publication : 2000), les articles sont accessibles par le plan du site.
Je vais envoyer un mot à l’auteur pour savoir s’il a une piste, car c’est vraiment pratique et bien fait, ça vaut la peine de l’essayer.
Alain K
Bravo et bonne continuation pour votre site très intéressant !
J’ai deux soucis avec Xprotector : 1) Il ne fonctionne pas en local, j’ai bien la page de login mais avec la meilleure volonté du monde je n’arrive pas a afficher la page protégée, mais c’est peut etre normal en local ? 2)Apres le transfert sur Multimania la Xprotector ne fait plus rien du tout, même pas de page login rien, nada ! Cà vient de Multimania ? merci.
l’auteur de Xprotector précise dans sa doc que c’est inutilisable en local... et il indique également quelques caractéristiques de base pour fonctionner. si tu les lis tu trouveras certainement la réponse à tes questions !
Hello,
Je pense effectivement que cela vient de la couche Multimania. N’hésite pas à les contacter.
par contre, je suis d’accord avec toi, l’absence de fonctionnement en local est un vrai point bloquant.
Stéphane

Bonjour,
il y a tout de même beaucoup plus simple :
Un script php en début de page qui vérifie que le login et le password existe avant d’afficher le reste de la page : phpsecure.
Les login et passwd sont dans la base mysql, on peut y mettre des niveaux d’accès (admin, user, group, etc...) et il n’y manque que l’interface de gestion via le web.
Un des avantages énorme de ce script c’est de permettre l’envoi des meta tag (title, keywords, description) AVANT la protection : un moteur de recherche comme google indexera donc quand même correctement la page bien qu’elle ne soit accessibles qu’aux abonnés.
Chez nous un mot clef "public" "privé" détermine si, dans une boucle le script de protection est activé. Le chef de rubrique peut ainsi voir ce qu’il passe en payant et ce qu’il laisse en gratuit.