Comment restreindre l’accès d’un article ou d’une rubrique dans l’interface publique par le statut.

All contributions published for previous SPIP versions

Cette contrib vous permet de limiter la visibilité de plusieurs pages de votre site aux seules personnes identifiées, que ce soit par leur statut
-  de visiteur
-  de rédacteur
-  d’administrateur.

Si un internaute accède à une page publique protégée, il sera invité à s’identifier par son login et son mot de passe. Une fois fait, s’il a le statut minimum requis, il accèdera directement à la page demandée.

Modifications requises

Les modifications requises sont mineures et peuvent facilement être appliquées à votre site.

Elles sont sans danger et peuvent tout aussi facilement être supprimées en tout temps.

Procédures


-  Assurez-vous que vous n’avez pas déjà des fichiers portant les noms:

  • rubrique_statut.html
  • article_statut.html
  • login_public.php3
  • login_public.html
  • rubrique_ok.php3
  • article_ok.php3

-  Téléchargez, décompressez et déposez à la racine de votre site les fichiers qui sont contenus dans ce document.

Réserver

-  Modifiez le fichier rubrique.php3:
Changez la valeur de $fond:

//$fond = "rubrique";
$fond = "rubrique_statut";

-  Modifiez le fichier article.php3:
Changez la valeur de $fond:

//$fond = "article";
$fond = "article_statut";

-  Créez un nouveau groupe de mots-clé appelé Accessibilité
-  À la question Les mots-clés de ce groupe peuvent être associés, cochez pour cet exercice aux rubriques
 [1]

-  Créez dans ce groupe les mots-clés les mots:

  • Administrateur
  • Rédacteur
  • Visiteur

Utilisation

Ajoutez le mot clé Administrateur, Rédacteur ou Visiteur pour limiter l’accès public d’une rubrique ou d’un article.

Explication

Prenons par exemple le cas d’une rubrique réservée:
le fichier rubrique.php3 n’appellera plus directement comme squelette le fichier rubrique.html mais plutôt le squelette contenu dans le fichier rubrique_statut.html.

Ce squelette n’affiche rien, il permet simplement de vérifier si la rubrique est limitée en accès public. Et si oui, de vérifier si l’internaute s’est identifié par son login et son mot de passe. Après, il vérifie s’il a le statut minimum requis. [2]

Une fois cette vérification faite, on affichera la rubrique telle que prévue par votre squelette rubrique.html

Les seuls fichiers vraiment nouveaux sont rubrique_statut.html:

<BOUCLE_accessibilite(MOTS){id_rubrique}{type=Accessibilité}>
                <BOUCLE_a(RUBRIQUES){id_rubrique}{id_mot}{titre_mot=Administrateur}>
                        <?
                        if ($auteur_session['statut']!='0minirezo'){
                        ?>
                        <INCLURE(login_public.php3){id_rubrique}>
                        <?
                        }
                        else {
                        ?>
                        <INCLURE(rubrique_ok.php3){id_rubrique}>
                        <?
                        }
                        ?>
                </BOUCLE_a>
                <BOUCLE_b(RUBRIQUES){id_rubrique}{id_mot}{titre_mot=Rédacteur}>
                        <?
                        if ($auteur_session['statut']!='1comite'&& $auteur_session['statut']!='0minirezo'){
                        ?>
                        <INCLURE(login_public.php3){id_rubrique}>
                        <?
                        }
                        else {
                        ?>
                        <INCLURE(rubrique_ok.php3){id_rubrique}>
                        <?
                        }
                        ?>
                </BOUCLE_b>
                <BOUCLE_c(RUBRIQUES){id_rubrique}{id_mot}{titre_mot=Visiteur}{lang_select=non}>
                        <?
                        if ($auteur_session['statut']!='6forum'&&$auteur_session['statut']!='1comite'&& $auteur_session['statut']!='0minirezo'){
                        ?>
                        <INCLURE(login_public.php3){id_rubrique}>
                        <?
                        }
                        else {
                        ?>
                        <INCLURE(rubrique_ok.php3){id_rubrique}>
                        <?
                        }
                        ?>
                </BOUCLE_c>
        </BOUCLE_accessibilite>
<INCLURE(rubrique_ok.php3){id_rubrique}>
<//B_accessibilite>

et

article_statut.html:

<BOUCLE_accessibilite(MOTS){id_article}{type=Accessibilité}>
                <BOUCLE_a(ARTICLES){id_article}{id_mot}{titre_mot=Administrateur}>
                        <?
                        if ($auteur_session['statut']!='0minirezo'){
                        ?>
                        <INCLURE(login_public.php3){id_article}>
                        <?
                        }
                        else {
                        ?>
                        <INCLURE(article_ok.php3){id_article}>
                        <?
                        }
                        ?>
                </BOUCLE_a>
                <BOUCLE_b(ARTICLES){id_article}{id_mot}{titre_mot=Rédacteur}>
                        <?
                        if ($auteur_session['statut']!='1comite'&& $auteur_session['statut']!='0minirezo'){
                        ?>
                        <INCLURE(login_public.php3){id_article}>
                        <?
                        }
                        else {
                        ?>
                        <INCLURE(article_ok.php3){id_article}>
                        <?
                        }
                        ?>
                </BOUCLE_b>
                <BOUCLE_c(ARTICLES){id_article}{id_mot}{titre_mot=Visiteur}{lang_select=non}>
                        <?
                        if ($auteur_session['statut']!='6forum'&&$auteur_session['statut']!='1comite'&& $auteur_session['statut']!='0minirezo'){
                        ?>
                        <INCLURE(login_public.php3){id_article}>
                        <?
                        }
                        else {
                        ?>
                        <INCLURE(article_ok.php3){id_article}>
                        <?
                        }
                        ?>
                </BOUCLE_c>
        </BOUCLE_accessibilite>
<INCLURE(article_ok.php3){id_article}>
<//B_accessibilite>

Pour simplifier cette contrib, le fichier login_public.html est simplement le fichier login.html standard de SPIP où on a remplacé le formulaire privé (#LOGIN_PRIVE) en formulaire public (#LOGIN_PUBLIC). À la différence qu’une fois identifié, l’internaute ayant le statut minimum requis verra s’afficher la rubrique ou l’article demandé et non l’interface privée.

Nous avons également conservé, pour simplifier, les mêmes noms de fichiers pour ce qui est des fichiers rubrique_ok.php3, rubrique_ok.html et article_ok.php3, article_ok.html. Mais cela n’est pas recommandé, car on donne accès aux squelettes et nous ouvrons la porte à des chemins de contournements possibles.

Pour renforcer la sécurité, on doit changer les noms des deux fichiers rubrique_ok.php3 et article_ok.php3 pour des noms de votre choix et modifier les fichiers rubrique_statut.html et article_statut.html en conséquence.

On peut changer également les noms des fichiers rubrique_ok.html et article_ok.html et modifier en conséquence les fichiers rubrique_ok.php3 et article_ok.php3. Cela complique la vie aux intrus qui voudraient contourner la limitation d’accès.

Exemple

On ajoute simplement une extension numérique au hasard à notre fichier [3]:

-  Changer le nom du fichier rubrique_ok.html ou rubrique_ok_5943.html
-  Modifier le fichier rubrique_ok.php3 (ou l’équivalent selon le nom que vous lui aurez donné)
//$fond = ’rubrique_ok’;
$fond = ’rubrique_ok_5943’;

Il faut aussi se méfier des fichiers appelés par des INCLURE. Si on donne accès au squelette, on donne aussi le nom de ces fichiers. Et si on donne le nom d’une inclusion qui appelle une partie cachée de l’article, on donne ainsi la possibilité d’appeler directement cette inclusion.

Personnellement, j’utilise même une variable de session qui protège ces pages si elles ne sont pas appelées par rubrique.php3 et article.php3 ainsi que les fichiers appelés par INCLURE. Cela pourrait faire l’objet d’une autre contrib.

Modifications additionnelles

Cette contrib est une simplification d’une utilisation plus complexe que nous faisons sur plusieurs sites de l’accès limités à l’interface publique.

Sur plusieurs d’entres eux, les articles, les rubriques, les brèves et même les sites référencés portant un des mots-clés du groupe Accessibilité n’apparaissent dans aucun menu du site lorsqu’on a pas le statut requis. Une fois identifié, les divers menus s’enrichissent.

Cela permet d’éviter la frustration de se voir refuser l’accès à une page alors qu’on nous l’offre dans le menu ou le plan du site. [4]

Cela devrait faire l’objet d’une autre contrib.

Voir Comment gérer les rubriques réservées

Footnotes

[1Sur plusieurs sites, j’utilise ce groupe de mots-clés pour les quatre options possibles.

[2Les bidouilleurs pourront ajouter un message de leur cru pour avertir l’internaute qui se sera identifié et qui n’aura pas le statut requis qu’il ne peut visualiser cette page, et ne plus afficher le formulaire.

[3En conservant le même nom suivi d’une extension, on facilite la gestion des fichiers qui se retrouvent souvent classés par ordre alphabétique dans des outils comme Dreamweaver ou autre.

[4Il faut aussi penser à modifier les fichiers backend.php3 si on ne veut pas que les rubriques ou les articles non accessibles y soient listés.

Discussion

26 discussions

  • Ciao,
    ottimo contrib. Ho modificato un po’ i tuoi file per gestire le rubriche protette in maniera gerarchica, ovvero, in modo tale che se una rubrica padre è protetta, lo saranno anche tutte le rubriche figlie ed i relativi articoli.

    Inoltre, ho utilizzato <INCLUDE(page.php3){fond=rubrique}....> in modo da non creare i file article_ok.php3 e rubrique_ok.php3 e rendere meno probabile che qualcuno possa richiamare direttamente le pagine senza passare per la verifica di login.

    Ovviamente tutto ciò funziona dalla versione 1.8.2e in poi.

    Se ti interessa posso inviarti i file.

    Ciao

    Reply to this message

  • 1

    Cette contribution a l’avantage d’être simple à mettre en œuvre. Cependant, l’accès réservé aux administrateur est illusoire : un rédacteur a accès à tous les articles par le back-office et peut ainsi prendre connaissance de ceux qui sont réservés aux administrateurs.

    On peut améliorer cette contrib en ajoutant des fichiers
    -  breve_statut.html breve_ok.php3 (pour appliquer le contrôle d’accès aux brèves),
    -  imprimer_statut.html imprimer_ok.php3 (pour se éviter la faille de sécurité qui permet d’accéder au contenu en accès restreint via “imprimer”)

    Ces fichiers sont une adaptation de ce qui est écrit dans l’article pour article_statut.html et article_ok.php3 il faudra aussi adapter breve.php3 avec $fond = “breve_statut”; et imprimer.php3 avec $fond = “imprimer_statut”;

    • Comme j’en parle dans un autre message, il y a un moyen simple d’appliquer le contrôle à l’interface publique. Mais ce sera expliqué dans une autre contrib.

      Pour ce qui est du contrôle de l’accès dans les divers autre pages du site, ou toute inclusion, il va de soit qu’il faut pousser le contrôle.

      Personnellement, j’utilise beaucoup de fichiers non standard qui sont tous testés par un filtre vérifiant le statut du visiteur. Une inclusion ne peut être appelée directement : elle est protégée par une variable de session...

      Cette contrib est une base. Chacun doit être vigilent selon ses squelettes.
      Comme tu le dis, elle est simple a utilisée. Mais elle demande, c’est normal, à être adaptée selon l’utilisation des squelettes de chacun.

      Il faut rester vigilant!

    Reply to this message

  • 1

    “... les articles, les rubriques, les brèves et même les sites référencés portant un des mots-clés du groupe Accessibilité n’apparaissent dans aucun menu du site lorsqu’on a pas le statut requis. Une fois identifié, les divers menus s’enrichissent...”

    On fait comment ?

    Merci beaucoup pour votre travail.

    • J’utilise simplement un filtre qui vérifie si la personne a le statut requis.
      Disons pour simplifier que le filtre s’exprime comme suit pour une rubrique
      [(#ID_RUBRIQUE|id_statut“rubriques”)]
      Le filtre (dont je pourrais donner les détails dans une autre contrib) vérifie dans la tables demandée ( ici spip_rubriques demandé par “rubriques” ) si cette rubrique ( ici #ID_RUBRIQUE ) a un des mots-clés Administrateur, Rédacteur ou Visiteur.
      Si oui, il vérifie si le statut de la personne connecté est suffisant.

      Le filtre peut s’utiliser pour les articles, les rubriques, les brèves, les sites référencés et même les forums.

      Il retourne une booléenne qu’on peut utiliser pour choisir d’afficher ou non l’item dans le menu.

      Évidemment, cela implique de placer ce test dans tous les menus avant tout affichage.

      Mais cela devrait faire l’objet d’une autre contrib pour les détails.

    Reply to this message

  • 10

    Comment attribuer un code d’acces au visiteur ?
    Lorsque je crée un nouvel auteur, celui ci ne peut etre que administrateur ou redacteur.

    Comment peut on alors restreindre l’accès d’un article à un visiteur ?
    il y a qq chose qui m’échappe...

    • Bonne question! Normalement, les personnes ayant un statut de visiteur sur ton site obtiendraient se statut si tu as autoriser dans la configuration de ton site l’option “Accepter l’inscription de visiteurs du site public”.

      Donc, tu pourrais limiter l’accès à certaines rubriques ou articles aux personnes ayant un login et un mot de passe.

      Maintenant, pour dire vrai, je n’utilise jamais le statut visiteur comme ça.
      Je crée dans l’interface privée des auteurs auxquels j’attribue le statut de visiteur.

      Mais, tu as raison. Il n’y a pas, normalement, ce choix dans la liste. Il faut faire une petite modification dans le coeur de SPIP. Modification que je fais sur tous les sites.

      J’aime bien avoir plus de possibilités que moins...

    • très interressant, et comment fait on pour ajouter un statut visiteur dans l’espace privé ?

      je n’ai pas trouvé de contrib à ce sujet.

    • Je suis aussi à la recherche d’infos permettant de réaliser ces modifs...
      Toute aide est bienvenue....

    • Pour les versions antérieur à 1.8.2, il faut modifier le coeur de SPIP. Mais depuis la version 1.8.2, si on va dans la page ecrire/config-contenu.php3. Dans la première boite “Mode de fonctionnement par défaut des forums publics” coche Enregistrement obligatoire (les utilisateurs doivent s’abonner en fournissant leur adresse e-mail avant de pouvoir poster des contributions).

      Et hop! tu pourras attribuer à un auteur le statut de visiteur.
      Après avoir attribué à au moins un auteur le statut de visiteur, tu pourra toujours changer le “Mode de fonctionnement par défaut des forums publics” pour celui de ton choix.

      Maintenant que tu as un visiteur, le choix de créer un visiteur dans l’espace privée reste accessible.

      C’est ce qu’on appelle une option subtile! ;-)

    • Je t’invite à voir la réponse que j’ai fais au message suivant.

    • Je t’invite à voir la réponse qui suit.

    • bonjour

      j’ai installé spip 1.8.1
      comment puis le je mettre à jour vers 1.8.2

    • bonjour

      j’ai installé spip 1.8.1 comment puis le je mettre à jour vers 1.8.2 ?

    • Je t’invite à lire dans la documentation en ligne l’article Effectuer une mise à jour. N’oublie pas de faire une sauvegarde avant! ;-)

    • Sous SPIP 1.8.2e (et je ne sais pas depuis quand...), il suffit d’avoir un seul visiteur enregistré pour avoir la possibilité d’inscrire de nouveaux auteurs avec statut de visiteur.

      Donc, il suffit de:
      -  créer un article avec forum sur abonnement
      -  inscrire une adresse e-mail quelconque à ce forum
      -  supprimer ce forum (sinon “faille”...)

      Dès ce moment, SPIP 1.8.2e proposera “Admin, Rédac ET Visiteur” dans la liste des statuts. Je suppose que cela perdure tant qu’il existera au moins une personne avec ce statut.

      NB: les visiteurs peuvent d’ailleurs être listés “à part”.

    Reply to this message

  • 1

    Bonjour,

    Dans le cadre d’une variante (accès hierarchisé aux rubriques), j’ai des liens dans des articles appartenant à une rubrique protégée.

    Ces liens font référence à des documents (PDF par exemple) qui sont dans un répertoire APACHE protégé par mot de passe.

    Est-il possible de faire en sorte que l’identifiant et le mot de passe tapés sous spip permettent AUTOMATIQUEMENT d’accéder aux documents du répertoire apache protégé, cela sans avoir à retaper un identifiant et un mot de passe pour afficher le document PDF ?

    Merci par avance de vos réponses,

    Vincent

    • Là, je ne ne peux t’aider. Désolé! Mais si quelqu’un a une solution, je suis aussi preneur.

    Reply to this message

  • 1

    C’est exactement ce que je recherche. J’ai par contre une question :

    Si un rédacteur à un login pour l’interface privée. Qu’est ce qui l’empêche de l’utiliser pour voir l’article ou la rubrique concernée via l’interface privée ?

    C’est important, car j’en ai besoin, j’ai des rubriques que pour les administrateurs.

    • Comme je l’explique de le message précédent, il faut faire certaines modifications dans le coeur de SPIP pour tester si la personne a le statut pour voir on non une rubrique ou un article. Mais, cela demandant de manipuler des fichiers dans le dossier ecrire, je ferai une autre contrib pour expliquer comment bientôt.

      C’est rien de bien compliqué à faire...

      À suivre!

    Reply to this message

Add a comment

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 / PostgreSQL
  • 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 apparait.

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.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom