[Résolu] acces restreint et déconnexion

Bonjour

Pour l’instant, pour se deconnecter, j’ai ce code simple

<a href="#URL_LOGOUT" rel="nofollow" title="<:icone_deconnecter:>">
		<:icone_deconnecter:>
</a>

Mais si on est dans une rubrique à accès retreint et qu’on se déconnecte on a soit une page blanche, soit une erreur 401.

Je voudrais que si on se trouve dans une zone restreinte, ça renvoie sur la page sommaire et si on est ailleurs, ça renvoie sur la page en cours.

J’ai essayé de jouer avec #AUTORISER mais sans résultat.

Une idée ?

A vu de nez, je dirais, et sans tester que

  1. Normalement tu dois avoir un paramètre dans l’url lorsque tu viens de te deconnecter
  2. Donc tu pourrais utiliser ce paramètre pour savoir si c’est une deconnexion sur la page sur laquelle tu arrive et qui est en accès restreint
  3. Donc dans la page en accès restreint :
    a. Si les gens arrivent avec le paramètre dans l’url, tu utiliser |rediriger_par_entete pour renvoyer vers le sommaire
    b. Si non tu indique l’habituel message interdit.

Pour commencer, regarde la doc de #URL_LOGOUT
Tu peux lui passer l’url de destination voulue en argument

Oui, passer une url à #URL_LOGOUT, d’accord.
Mon problème est de détecter si on est sur une page (rubrique ou article) à accès retreint ou pas.

SI j’en crois la documentation

À cet effet, deux filtres ont été créés pour le plugin :

  • AccesRestreint_article_restreint appliqué à l’id_article
  • AccesRestreint_rubrique_restreinte appliqué à l’id_rubrique

Tu as là les filtres nécessaire pour répondre à ta question " Mon problème est de détecter si on est sur une page (rubrique ou article) à accès retreint ou pas."

J’avais bien lu ça mais j’ai testé

<BOUCLE_test_art(ARTICLES){id_article}></BOUCLE_test_art>
[(#ID_ARTICLE|AccesRestreint_article_restreint|?{#SET{url,#URL_SITE_SPIP},#SET{url,#SELF}})] 
<//B_test_art>
<BOUCLE_test_rub(RUBRIQUES){id_rubrique}></BOUCLE_test_rub>
[(#ID_RUBRIQUE|AccesRestreint_rubrique_restreinte|?{#SET{url,#URL_SITE_SPIP},#SET{url,#SELF}})] 
<//B_test_rub>
#GET{url}

et #GET{url} me retourne systématiquement l’url de la rubrique ou de l’article.

Hum, je suis surpris mais je reproduit aussi. Je tente de regadrer le code.

Hum, deux choses

  1. Tu devrais passer explicitement #SESSION{id_auteur} comme paramètre des filtres, sinon je crains que tu ne tombe sur des souci de cache côté publique (et du coup mettre le fragment qui fait cela dans un squelette à part appelé via <INCLURE> pour éviter de perdre trop de cache)
  2. Par ailleurs, ton problème vient de ta deuxième boucle
<BOUCLE_test_rub(RUBRIQUES){id_rubrique}></BOUCLE_test_rub>
[(#ID_RUBRIQUE|AccesRestreint_rubrique_restreinte|?{#SET{url,#URL_SITE_SPIP},#SET{url,#SELF}})]
<//B_test_rub>

si tu es dans un contexte où tu n’a PAS de rubrique courante (par exemple hors d’une boucle article et sans que id_rubrique ne soit passé à l’url) et bien le #ID_RUBRIQUE que tu test vaux 0. Donc rien n’est restreint.

La solution serait de faire

<BOUCLE_test_rub(RUBRIQUES){id_rubrique}></BOUCLE_test_rub>
[(#ID_RUBRIQUE|>{0}|oui)
	[(#ID_RUBRIQUE|AccesRestreint_rubrique_restreinte|?{#SET{url,#URL_SITE_SPIP},#SET{url,#SELF}})]
]
<//B_test_rub>

ATTENTION également au cache. J’ai du forcer le vidage du cache squelette pour que cela marche.

Attention : La boucle ne ramenant rien, SPIP considère la boucle en échec et applique toujours la partie //B_. Là, tes boucles sont vides donc elles produiront toujours la partie //B_ (et elles ne servent à rien). Par hygiène SPIPienne, il faut toujours au moins un espace entre le tag ouvrant BOUCLE et le tag fermant /BOUCLE si on veut que la boucle soit active. Ajoute donc au moins un espace dans leurs corps.

Par ailleurs, il est plus léger et ça me semble plus lisible et plus maintenable d’écrire :

#SET{url,#ID_RUBRIQUE|AccesRestreint_rubrique_restreinte|?{#URL_SITE_SPIP,#SELF}}

(et pareil pour _test_art).

Ou utilise, ce qui est plus lisible, la syntaxe raccourcie avec une boucle autofermante.

Avec

<BOUCLE_test_rub(RUBRIQUES){id_rubrique}> </BOUCLE_test_rub>
[(#ID_RUBRIQUE|>{0}|oui)
	#SET{url,#ID_RUBRIQUE|AccesRestreint_rubrique_restreinte|?{#URL_SITE_SPIP,#SELF}}
]
<//B_test_rub>

et mes autres essais, j’ai toujours l’url courante renvoyée par #GET{url}

Bonjour,
Bien que je n’y comprenne rien, je vais tenter de jouer le rôle du petit canard plastique (celui du dev, pas celui du bain :innocent:)
Actuellement, spip4 a un comportement unique lorsqu’on se déconnecte, il se repositionne sur la page.
si la page est en accès libre → on affiche la page
si la page est en accès restreint → on affiche 401 (logique)

J’ai un spip 3 qui a un comportement légèrement différent (fait par un ancien spipeur)
si la page est en accès libre → on affiche la page
si la page est en accès restreint → on affiche le module de connexion (et on reviendra sur la page en cas de connexion)

Je pense que vous devez pouvoir adapter ce comportement en affichant le sommaire en lieu et place du module.
Bien que cela soit du spip3, je vous met le truc au cas où cela pourrait vous donner des idées

J’espère avoir cerné et copié l’endroit correspondant :wink:
Clt

</li>
	  <li>[ (#SESSION{id_auteur}|?{' '})<a href="#URL_LOGOUT" rel="nofollow"><img src="#CHEMIN{images/zones-acces-24.gif}" height="18" align="absmiddle">&nbsp;<:icone_deconnecter:></a> 
        ][(#SESSION{id_auteur}|?{'',' '})<a href="[(#URL_PAGE{login}|parametre_url{url,#SELF})]" rel="nofollow" class='login_modal'><img src="#CHEMIN{images/zones-acces-24.png}" height="18" align="absmiddle">&nbsp;<:lien_connecter:></a>]</li>
	[<li>(#AUTORISER{ecrire})<a href="#EVAL{_DIR_RESTREINT_ABS}"><:espace_prive:></a></li>]

Merci choucas mais le problème n’est pas là.
J’ai bien au départ

[(#SESSION{id_auteur}|?{' '})
<a href="#URL_LOGOUT" rel="nofollow" title="<:icone_deconnecter:>">
		<:icone_deconnecter:>
		</a>
]

C’est l’url passée à #URL_LOGOUT qui m’occupe.

@J-C as tu passé, comme suggéré, #SESSION{id_auteur} a l’url à ```
AccesRestreint_rubrique_restreinte

Si avec le code que j’ai fourni, le gars est capable de faire afficher le module password en lieu et place d’un 401, on devrait pouvoir faire la même chose en remplaçant l’appel de la page du module par celle du sommaire, non?

Clt

Pour l’instant j’en suis là :

[(#SESSION{id_auteur}|?{' '})
	<div class="identification-light deconnexion">

<BOUCLE_test_art(ARTICLES){id_article}> </BOUCLE_test_art>
	#SET{url,#ID_RUBRIQUE|AccesRestreint_article_restreint|?{#URL_SITE_SPIP,#SELF}}
<//B_test_art>
<BOUCLE_test_rub(RUBRIQUES){id_rubrique}> </BOUCLE_test_rub>
[(#ID_RUBRIQUE|>{0}|oui)
	#SET{url,#ID_RUBRIQUE|AccesRestreint_rubrique_restreinte|?{#URL_SITE_SPIP,#SELF}}
]
<//B_test_rub>
#GET{url}

		<p><a href="#URL_LOGOUT{#GET{url}}" rel="nofollow" title="<:icone_deconnecter:>">
		<:icone_deconnecter:>
		</a></p>
	</div>]

le #GET{url} n’étant là que pour tester.

(#SESSION{id_auteur}|oui) serait plus clair que (#SESSION{id_auteur}|?{' '}) et de même #ID_RUBRIQUE|>{0}|oui peut à mon avis plus simplement s’écrire #ID_RUBRIQUE|oui.

Ensuite tu utilises #ID_RUBRIQUE dans le //B de ta boucle ARTICLES, et tu n’y conditionnes pas le #SET comme tu le conditionnes dans le //B de la boucle RUBRIQUES. Faut te relire.

En effet, je faisais mes tests sur les rubriques d’où les erreurs dans la boucle ARTICLES
Voici donc mon nouveau code :

[(#SESSION{id_auteur}|oui)
	<div class="identification-light deconnexion">

<BOUCLE_test_art(ARTICLES){id_article}> </BOUCLE_test_art>
[(#ID_ARTICLE|oui)
	#SET{url,#ID_ARTICLE|AccesRestreint_article_restreint|?{#URL_SITE_SPIP,#SELF}}
]
<//B_test_art>
<BOUCLE_test_rub(RUBRIQUES){id_rubrique}> </BOUCLE_test_rub>
[(#ID_RUBRIQUE|oui)
	#SET{url,#ID_RUBRIQUE|AccesRestreint_rubrique_restreinte|?{#URL_SITE_SPIP,#SELF}}
]
<//B_test_rub>
#GET{url}

		<p><a href="#URL_LOGOUT{#GET{url}}" rel="nofollow" title="<:icone_deconnecter:>">
		<:icone_deconnecter:>
		</a></p>
	</div>]

Mais #GET{url} ne me renvoie plus rien

Bon,
méthode bourrin :
écraser dans V4 par le code V3
→ on se retrouve avec un magnifique 401
et avec les squelettes de la dist V3, on a aussi une 401

c’est le plugin qui génère cette 401 car on trouve ceci dans le pipeline

/**
 * Detecter les demande d'acces aux pages restreintes
 * et re-orienter vers une 401 si necessaire
 *
 * @param array $contexte
 * @return array
 */

C’est donc bien le dev qui réoriente dans ses squelettes et ce n’est sans doute pas dans le code login/logout qu’il faut agir

Comment il a fait pour réorienter vers le formulaire password sans toucher au plugin, mystère.
Je ne sais pas ou ni quoi chercher
Clt

je pense que ça, ça intervient après : si on demande une page en accès restreint sans y être autorisé, on a une 401.
Je veux justement éviter cela en redirigeant vers la page d’accueil.