Tout verrouiller

Comment protéger par mot de passe des rubriques ou des articles

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Comment sans bidouiller dans le noyau de Spip on peut à l’aide des mots clés des boucles et de php placer des articles et des rubriques en acces protégé.

Introduction : protéger son site avec SPIP

Restreindre l’accès à certaine partie de son site semble un besoin récurrent des webmasters de sites sous SPIP. Plusieurs solutions existent, la plus classique étant celle expliquée (un peu succintement) sur le site officiel qui permet de réserver certaines parties du site aux seuls membres authentifiés (rédacteurs ou visiteurs enregistrés). Ici nous allons détailler une autre méthode, à l’aide des mots clés, qui est loins d’être parfaite, mais qui suffira largement dans la plupart des cas simples.

Qu’est-ce que cette contrib permet de faire ?

Permettre aux administrateurs du site de placer certains articles
ou certaines rubriques en accès par mot de passe.

On pourra avec ceci créer autant de mots de passe que l’on voudra.
Protéger la rubrique les saucisses avec le mot de passe sauciflon sec
et la rubrique jambon avec le mot de passe jamblon sec.

Je protégerai pas mon compte en banque avec mais ça risque d’être suffisant pour la plupart
des besoins.
Plus precisement, allez voir un peu plus loin dans l’article : Les limitations du systeme.

C’est surtout très facile a mettre en place.

Installation

moins de 5 minutes
-  Décompresser acces.zip et installer controle_acces_rubrique.html controle_acces_rubrique.php3
controle_acces_article.html controle_acces_article.php3 FA2.php3 et enregistre_session2.php3 à
la racine de votre site.

-  Créer un groupe de mot clé que vous appelerez « acces multiple »,vous cocherez les bonnes cases
pour que ce groupe ne soit accessible qu’aux administrateurs et puissent être associés aux articles et
aux rubriques.

-  Notez soigneusement le numéro id_groupe de ce groupe de mots clés, vous en avez impérativement
besoin !!! nous le nommerons désormais <votre id_groupe>
(attention ne confondez pas id_mot avec id_groupe)

-  dans ce groupe créer 2 mots « sauciflon sec » et « jamblon sec »

-  puis au TOUT DÉBUT (cad à la premiere ligne au premier caractère) de article.html
placer ce code.

<INCLURE(controle_acces_article.php3){id_groupe=<votre id_groupe>}{id_article}>

-  puis au TOUT DÉBUT (cad à la premiere ligne au premier caractere) de rubrique.html
placer ce code.

<INCLURE(controle_acces_rubrique.php3){id_groupe=<votre id_groupe>}{id_rubrique}>
  1. Choisissez un article ou une rubrique de votre choix , associez le mot « sauciflon sec » et cliquez
    sur aller voir en ligne. Rentrer « sauciflon sec » dans le Formulaire d’Accès (FA) et si tous se passe bien votre article
    ou votre rubrique apparaît.

Et voila c’est fini

Et pour les courageux voici

Les Explications

Nous présenterons ce travail en deux temps

-  Temps 1 : on implémentera un accès restreint pour les articles seulement
car c’est plus facile.
-  Temps 2 : En se servant de ce qui a été fait au temps 1
on implémentera l’accès restreint pour les rubriques, ce qui exige une démarche
d’acquisition des informations qui peuvent être éventuellement présentes
dans les rubriques parentes.

Temps 1

-  controle_acces_article.html

<BOUCLE_acces(MOTS){id_groupe}{id_article}{0,1}>
<?php $acces='#TITRE'; ?>
</BOUCLE_acces>
<?php
//si la variable $acces a ete cree alors on lance le script
//cad si un acces restreint est bien associé a l'article
    session_start();
    //echo "variable de session".$_SESSION['$acces'];
if (isset($acces)){
    //recuperation du nom de script avec les arguments de requettes
    $origine=$HTTP_SERVER_VARS['SCRIPT_NAME']."?".$HTTP_SERVER_VARS['QUERY_STRING'];
    //on demarre une session

    //et on verifie si la variable $acces
    //est bien presente dans le contexte de session
    //et si le temps qu'elle contient n'est pas trop vieux
    //cad depasse de 5 minutes
    if ( isset($_SESSION['$acces']) and ( (date("U")-$_SESSION['$acces']) < 10 )and ($_SESSION['demande_enregistrement']==$acces) ){

        //on raffraichit la valeur
        //et on l'enregistre dans le contexte de session
        $_SESSION['$acces']=date("U");
    }else{
        //l'utilisateur n'a pas ete enregistre ou sa date d'enregistrement est trop vielle
        //on efface $$acces du contexte de session
        unset($_SESSION['$acces']);
        // a la place on enregistre une variable demande_enregistrement dont la
        //valeur depend de acces
        $_SESSION['demande_enregistrement']=$acces;
        //on dirige l'utilisateur vers le FA en sauvant son article demande
        header("location: FA2.php3?origine=$origine");
    }
}

Attention il ne doit y avoir aucun espace entre le début du fichier et ce script
car on fait appel à la fonction header qui ne peut être appelé que si aucune information
n’a été expédié au navigateur avant son invocation.

-  Le FA ou Formulaire d’Accès

Il est sans mystère voici son code FA2.php3
Il va collecter un mot de passe qui sera envoyé à un script de contrôle et d’enregistrement

<?php
//correspond a l'article demandé
$origine=$HTTP_GET_VARS['origine'];
//Si le mot de passe est erronée on renvoie ce message
$erreur=$HTTP_GET_VARS['erreur'];
?>
<html>
<body onload="mdp.getFocus()">
<?php if(isset($erreur)) echo $erreur; ?>

<div style='position:absolute;top:30%;left:30%'>
<form action="enregistre_session2.php3?origine=<?php echo $origine; ?>" method="POST" >
<p>l'acces a cette rubrique (ou article) est protégé par un mot de passe</p>
<input type=password name="mdp">
<input type=submit value="valider">
</form><br>
<a href="sommaire.php3">Retour au site publique</a>
</div>
</body>

-  Puis le script d’enregistrement

enregistre_session.php3

<?php
$origine=$HTTP_GET_VARS['origine'];
$mdp=$HTTP_POST_VARS['mdp'];
session_start();
//on recupere la demande d'enregistrement à $acces
$acces=$_SESSION['demande_enregistrement'];
//debug echo "mdp: $mdp acces : $acces";
if ($mdp==$acces){
    $_SESSION['$acces']=date("U");
    //debug echo "valeur de _SESSION  est ".$_SESSION['$acces'];
    header("location: $origine");
}else{
    $erreur="votre mot de passe est erroné votre administrateur l'a peut-etre change";
    header("location: FA2.php3?erreur=$erreur&origine=$origine");
}
?>

Ce script récupère la demande d’enregistrement qui est une variable de session qui contient le titre
du mot clé. Puis il compare cette valeur avec le mot de passe entré dans FA2.php3 si celui-ci est
bon il crée la variable de session $acces qui contient la date à laquelle l’utilisateur s’est enregistré

Et voila l’affaire est dans le sac si vous m’avez lu jusque
la je félicite votre patience :)

Temps 2 : généralisations aux rubriques

La généralisations aux rubriques est un peu plus subtile car il faut
pouvoir gérer les problèmes d’acquisition (qui sont très bien gérées dans Zope par ailleurs)

En effet si une rubrique se trouve être la sous rubrique d’une rubrique en accès par mot de passe
elle doit pouvoir hériter de ses propriétés. Tous les articles d’une telle rubrique aussi.

Ce qui va se résoudre à coup de boucle hiérarchie.

controle_acces_rubrique.html

<?php
    //vérifie si une rubrique parente
    //est en acces par mot de passe
?>
<BOUCLE_contexte_rubrique(RUBRIQUES){id_rubrique}>
<BOUCLE_hierarchie_acces(HIERARCHIE){id_rubrique}>
<BOUCLE_parent_acces(MOTS){id_rubrique}{id_groupe}>
<?php $acces='#TITRE'; ?>
</BOUCLE_parent_acces>
</BOUCLE_hierarchie_acces>
</BOUCLE_contexte_rubrique>
<?php
    //vérifie si la rubrique elle meme
    //est en acces par mot de passe
?>
<BOUCLE_acces_rubrique_simple(MOTS){id_rubrique}{id_groupe}>
<?php $acces='#TITRE'; ?>
</BOUCLE_acces_rubrique_simple>
<?php
//si la variable $acces a ete cree alors on lance le script
//cad si un acces restreint est bien associé a la rubrique
    session_start();
    //echo "variable de session".$_SESSION['$acces'];
if (isset($acces)){
    //recuperation du nom de script avec les arguments de requettes
    $origine=$HTTP_SERVER_VARS['SCRIPT_NAME']."?".$HTTP_SERVER_VARS['QUERY_STRING'];
    //on demarre une session

    //et on verifie si la variable $acces
    //est bien presente dans le contexte de session
    //et si le temps qu'elle contient n'est pas trop vieux
    //cad depasse de 5 minutes
    if ( isset($_SESSION['$acces']) and ( (date("U")-$_SESSION['$acces']) < 10 ) and ($_SESSION['demande_enregistrement']==$acces)){

        //on raffraichit la valeur
        //et on l'enregistre dans le contexte de session
        $_SESSION['$acces']=date("U");
    }else{
        //l'utilisateur n'a pas ete enregistre ou sa date d'enregistrement est trop vielle
        //on efface $$acces du contexte de session
        unset($_SESSION['$acces']);
        // a la place on enregistre une variable demande_enregistrement dont la
        //valeur depend de acces
        $_SESSION['demande_enregistrement']=$acces;
        //on dirige l'utilisateur vers le FA en sauvant son article demande
        header("location: FA2.php3?origine=$origine");
    }
}

et on fait pareil avec controle_acces_article.html

<?
    //verifie si la rubrique ou rubrique parente contenant
    //l'article est en acces par mot de passe
?>
<BOUCLE_contexte_article(ARTICLES){id_article}>
<BOUCLE_contexte_rubrique(RUBRIQUES){id_rubrique}>
<BOUCLE_hierarchie_acces(HIERARCHIE){id_rubrique}>
<BOUCLE_parent_acces(MOTS){id_rubrique}{id_groupe}>
<?php $acces='#TITRE'; ?>
</BOUCLE_parent_acces>
</BOUCLE_hierarchie_acces>
</BOUCLE_contexte_rubrique>
</BOUCLE_contexte_article>
<?
    //verifie si la rubrique ou rubrique parente contenant
    //l'article est en acces par mot de passe
?>
<BOUCLE_acces_article_simple(MOTS){id_groupe}{id_article}{0,1}>
<?php $acces='#TITRE'; ?>
</BOUCLE_acces_article_simple>
<?php
//si la variable $acces a ete cree alors on lance le script
//cad si un acces restreint est bien associé a l'article
    session_start();
    //echo "variable de session".$_SESSION['$acces'];
if (isset($acces)){
    //recuperation du nom de script avec les arguments de requettes
    $origine=$HTTP_SERVER_VARS['SCRIPT_NAME']."?".$HTTP_SERVER_VARS['QUERY_STRING'];
    //on demarre une session

    //et on verifie si la variable $acces
    //est bien presente dans le contexte de session
    //et si le temps qu'elle contient n'est pas trop vieux
    //cad depasse de 5 minutes
    if ( isset($_SESSION['$acces']) and ( (date("U")-$_SESSION['$acces']) < 10 ) and ($_SESSION['demande_enregistrement']==$acces)){

        //on raffraichit la valeur
        //et on l'enregistre dans le contexte de session
        $_SESSION['$acces']=date("U");
    }else{
        //l'utilisateur n'a pas ete enregistre ou sa date d'enregistrement est trop vielle
        //on efface $$acces du contexte de session
        unset($_SESSION['$acces']);
        // a la place on enregistre une variable demande_enregistrement dont la
        //valeur depend de acces
        $_SESSION['demande_enregistrement']=$acces;
        //on dirige l'utilisateur vers le FA en sauvant son article demande
        header("location: FA2.php3?origine=$origine");
    }
}

Limitations du système

-  Un accès par http://mon_site.org/mot.php3?id_mot=XX permet de deviner le mot de passe en incrémentant simplement XX à partir de 1, sur un site contenant peu de mots clés, facile de le trouver, pour remedier à cela il faut supprimer le couple de fichiers mot.php3/mot.html, et y repenser en cas de mise à jour de SPIP.
Ou alors dans le squelette mots.html modifier la Boucle MOTS : <BOUCLE_de_mots(MOTS){les criteres deja present}{id_groupe!=<groupe  des codes secret>}>

-  Il faut s’assurer que les divers squelettes alternatifs ou récapitulatifs (backend, resume, nouveautes, /oo, imprimer, plan, recherche, etc...) n’afficheront pas d’articles qui exigent un mot de passe. C’est très frustrant pour un visiteur de se faire présenter une liste d’articles dont on lui refuse l’accès. Pour cela il faudra exclure les articles correspondants :
Par exemple a l’aide d’une première boucle et du critère doublons :

<BOUCLE_articlesproteges(ARTICLES){les criteres deja present}{id_groupe!=<groupe  des codes secret>}{doublons}></BOUCLE_articlesproteges>
<BOUCLE_principale(ARTICLES){mes criteres}{doublons}>...</BOUCLE_principale>
 

-  Il faut penser à ajouter quelques directives dans son fichier robots.txt pour que Google et compagnie n’indexent pas des articles accessibles par mot de passe.

Ouf, quel travail pour protéger quelques articles !

Discussion

59 discussions

  • 3
    Pierre-Edouard

    Michael, mon amour tu es le plus fort !

    Bravo !

    • Pierre-Edouard

      Sauf que !

      J’ai tout bien fait comme tu l’as expliqué, et lorsque je veux visiter la rubrique supposée être protégé, j’obtiens ce merveilleux message :

      Fatal error: Call to unsupported or undefined function session_start() in your script on line 4

      Une précision tout de même : les seules différences notables avec ton explication sont que mon fichier « rubrique.html » s’appelle en fait « testrubrique.html » (fainéant comme je suis, la page de test est restée là...), et que mon mot de passe n’est pas « sauciflon sec ».

      J’espère que quelqu’un saura m’aider dans cette mésaventure.

    • Si session_start est pas reconnu pas reconnu c’est que ton fichier n’est pas un squelette ou que ta version de php a fait les bonheurs de mon grand pere

    • Pierre-Edouard

      Que veux-tu dire par « mon fichier n’est pas un squelette » ?

      Mon site petessier.org tourne sous SPIP 1.5.

    Répondre à ce message

  • 1
    Jean-Michel

    En fait j’aimerais pouvoir adapter cette astuce mais côté auteur. Comment un auteur ne pourrait-il écrire que dans une seule rubrique du site, par exemple ?

    Jean-Michel

    • Il suffit de restreindre l’access à une ou plusieurs rubriques dans son profil ; il devient alors limité.

      Le problème que j’ai identifié, c’est qu’un simple auteur peut avoir accès par l’interface de saisie à la lecture des articles « protéges »...

    Répondre à ce message

  • Génial !
    Mais il m’a fallut aller dans la table groupe_mots pour lire l’id_groupe (qui était 2)

    Répondre à ce message

  • 5
    JJ GOINEAU

    Et si je veux protéger tout le site avec un accès réservé ? En effet, je voudrais faire un site réservé qu’à mes élèves avec accès par login et par mot de passe.
    Comment dois-je m’y prendre ?

    • Salut,

      J’ai adapté la méthode de Courcy et DoriaN pour faire ce que tu demandes et plus.

      voir kit accès restreint et pilotage par mot clé sur bloOg (nouvelle version). (et oui, j’ai changé de méthode, plus de EVA, EVA est désormais dépassé au profit de la méthode Courcy dans les recommandation du Spip3C).

      C’est encore brouillon dans les explications car je viens de le coder mais ca marche au poil. Les connaisseurs et même les autres réussiront sans doute à se dépatouiller quand même.

      Je prépare une contrib plus générale sur la gestion d’un espace membre avec spip ou j’expliquerai ca avec moultes détails en séparant la méthode de mes graphismes.

      D’ici la j’espère que mon lien suffira pour démarrer.

      @ plus

      BoOz

    • Et bien tu mets en acces protege toutes les rubriques que tu crées à la racine. Et tu configure index.php3 pour qu’il pointe sur une rubrique de ton choix le tour est joué

    • attention : avec cette méthode le tour est joué sans l’identification (login/mot de passe) mais avec un mot de passe seulement.

    • JJ GOINEAU

      Quelqu’un peut-il me donner quelques précisions sur cette instruction :

      Créer un groupe de mot clé que vous appelerez « acces multiple »,vous cocherez les bonnes cases pour que ce groupe ne soit accessible qu’aux administrateurs et puissent être associés aux articles et aux rubriques.

      Je fais ça comment ? Dans la base de données ?

    • edition du site -> mots clé -> creer un groupe de mot clé

      Bon courage (utilise plutot le kit acces easy)

    Répondre à ce message

  • Bonjour,

    je m’interroge...quelle différence entre les 2 packs a telecharger ? Je réalise mon site en local sous EasyPHP avant de le mettre en ligne....devrais je changer de pack à la mise en ligne ?

    Cordialement

    Répondre à ce message

  • 1
    Delphiste47

    Bonjour
    Cette contrib est géniale, enfin pour moi puisque c’est ce que je m’évertuais à essayer de faire ... merci
    Elle fonctionne tres bien avec IE mais pas avec Mozilla ??? normal ou pas ? sinon quelle modif faut-il que je fasse ?

    • Tres surpenant car moi je travaille exclusivement sur mozilla et c’est avec mozilla que je l’ai dévellopé...Puvez-vous me donner votre version de Mozilla.

    Répondre à ce message

  • 1

    Bonjour,
    Tout d’abord, merci pour cette contribution.

    Globalement cela fonctionne chez moi, mais à chaque fois j’ai un message qui s’affiche me disant que ’mdp’ est indéfini. Si je valide par OK, l’authentification fonctionne correctement.
    Une suggestion ?

    Par ailleurs, comment faire pour personnaliser le formulaire de saisie du mot de passe ?

    Merci pour votre aide.

    • oui mdp est indéfini est un bug que j’ai oublié de lever, et pour personnaliser le formulaire
      d’authentification ouvrer le fichier FA2.php3 puis la faites ce qu’il vous plait.....

    Répondre à ce message

  • 2

    Je souhaite insérer un mot de passe pour accéder à la rubrique album, car je n’ai pas le droit de laisser accéder tout visiteur... J’ai suivi votre démarche mais rien ne se passe ; d’ailleurs je ne sais pas comment un FA (formulaire d’accès) pourrait apparaître et où il devrait apparaitre. J’ai vérifié mon groupe de mots clés, mis 2 mots clés, inséré le numéro du mot clé dasn article et rubrique.html, ...téléchargé le tout sur mon site..RIEN ne se passe, est-ce dû au squelette biospip ?

    • Oui bien sur il faut que tu rentres dans les squelette d’article et rubrique de bio spip pour faire les modifs en debut de page sinon ca ne peut pas marcher, comme tu dis rien ne se passe. Relis bien l’article.... A la lecture de ta question j’ai le sentiment que tu n’as pas tout saisi, il ne serait pas irraisonnable de demander au gars de biospip si il ne veulent pas à leur tour implémenter un systeme d’acces restreint, ma methode n’étant qu’une piste parmis d’autre

      @+

    • Faut-il rentrer dans les squelettes de article.html et rubrique.htrml ou directement dans album.html par exemple, puisque c’est la rubrique en question ? et tous les articles présents dans cette rubrique ?
      Merci

    Répondre à ce message

  • 4

    je crois que la redirection header ne marche pas avec tous les navigateurs (ca m’a fait le coup avec internet explorer 5 je crois)

    Du coup j’utilise le systeme des tests eva (décidement très malins) dans article.html pour voir si l’article à le mot clé acces_restreint : si oui j’appelle le squelette avec identification sinon j’appelle le squelette standard. Je protege aussi le squelette standard avec une boucle qui vérifie qu’on essaye pas d’afficher un article protegé en forcant le squelette standard avec une id d’article protégé.

    Je prépare une explication sur mon squelette de demo si les détails interressent certains.

    @ +

    • squelette de demo qui est là, désolé

      BloOg

    • Oui mais est-ce que ce systeme te permet de mettre toute une rubrique en acces protégé et d’etre sur que l’utilisateur ne vas pas essayer d’acceder à l’un de ces articles en tapant directement l’url de cette article dans son navigateur ? Qu’est-ce qui te garantit que la sous sous sous rubrique de la rubrique que tu as protégé est aussi bien protégée ?

    • Le systeme des header marche sur IE5 mais il fallait que je sois plus rigoureux dans l’écriture de mes scripts avant l’envoi éventuels de header c’est ce que fait acces_easy.zip

      @+

    • Bonjour,

      Mon systeme de redirection par mots clé à la EVA permet d’etre sur que l’on ne pirate pas un article en forcant l’url. Il est fondé une une duplication des squelettes. Il y a un squelette qui affiche les articles protégés en vérifiant que l’utilisateur est connecté par son login/mot de passe de membre du site et un squelette jumeau qui affiche les squelettes non protégés. Ce deuxieme squelette vérifie à l’aide d’une simple boucle spip que l’article qu’on tente d’afficher n’est pas protégé par un mot clé.

      Par ailleurs, je vais réutiliser ta méthode astucieuse de hiérarchie pour assurer l’héritage des droits d’une rubrique sur ses enfants qui n’existe pas encore dans le code que je propose.

      Ma méthode présente l’avantage (et l’inconvéniant) d’etre conditionné par un accès type « membre » car on test si l’utilisateur est un membre du site spip. Donc chaque utilisateur rentre son propre login/mot de passe. Avec ma méthode, il n’est pas prévu d’utiliser un mot de passe différent selon ce que l’on consulte.

      En poussant ma méthode, la différenciation des contenus pourrait se faire (mais je n’aime pas ca) par rapport au statut du membre (admin, redac, visiteur).

      Enfin ma méthode est (quasi)entièrement en spip pur avec des boucles.

      Nos deux méthodes sont donc d’un usage assez différent, la tienne permet d’acceder au contenu selon différents mots de passe que les initiés connaissent, la mienne permet de limiter l’acces à des membres du site (elle est incluse dans une logique de site communautaire avec contenus qui nécéssitent de savoir qui est connecté, pour dire bonjour machin ou des choses importantes comme ca par exemple ;-) ).

      @ +

    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 :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom