Authentification par htaccess qui "boucle" n fois si n fichiers protégés

WRInaute accro
Bonjour,

Certains visiteurs d'un de mes sites ont un problème d'accès à des galeries photos. Je pense finalement avoir réussi à reproduire le problème avec Chromium sous Ubuntu, le problème ne se produisant chez moi ni avec Konqui ou FF sous Ubuntu LL ni avec IE sous XP.

En pratique, le htaccess protège un sous répertoire, dans lequel se trouvent deux sous-répertoires comportant des fichiers JPG (des vignettes et des photos plus grandes). Sur mon Chromium, la fenêtre d'authentification apparaît à chaque affichage d'une photo dans la page HTML d'accès à la galerie de photos (= la page avec les n vignettes)! La fenêtre d'authentification apparaît donc en boucle o_O! Si je fais "Annuler", certaines photos restent grisées. Il "suffit" alors de faire F5, la page est rafraichie et l'ensemble des photos apparaît correctement (car l'authentification a été correctement faite initialement).

Quelqu'un voit-il comment sortir de cette situation? Ce que je veux = une seule authentification.

Merci,
Cordialement,
 
WRInaute occasionnel
Serait-ce un problème de linking internet au fichier qui affiche les vignette ?

Exemple :
/toto (protégé)
---/img
---/vignette

J'appel /toto/toto.html qui est protégé, on me demande une authentification.
Ce même fichier affiche des images provenant de /vignette. Dés lors, il me demande une authentification pour chaque passage vers ces fichiers.

As tu mis les vignette en lien relatif ?

Si oui je ne vois que la solution de mettre fichier, image et vignette dans le même répertoire.
 
WRInaute accro
Explication:

"La page HTML se charge sans authentification, et le browser tente d'afficher un grand nombre de photos en parallèle. Il demande alors le username/mot de passe pour chaque photo. Les browsers qui chargent les photos une par une n'ont pas de problème."
 
WRInaute accro
@Ehplod: l'URL donnée au dessus correspond à un album public (donc pas d'authentification). La structure des albums privés est par contre similaire.
 
WRInaute impliqué
Ton problème semble logique dans le sens ou comme toutes les photos sont demandées avant que l'authentification ait pu être effectuée, alors il te demande de t'identifier pour chacune d'elle, la première photo protégée ne mettant pas le site en "pause" le temps que le visiteur rentre ses identifiants.

Pour la solution, il faudrait que tu puisses faire en sorte de vérifier si le visiteur est loggué avant de charger la page avec les photos, le soucis étant que je ne suis pas sur que l'on puisse facilement interagir entre les sessions gérées via .htaccess et celle en php.

Je pensais par exemple que tu pourrais vérifier l'existence d'un cookie, mais je n'ai pas l'impression que l'identification via .htaccess en créé un (ou alors en tout cas il n'apparait pas dans les cookies de firefox).

Tu peux essayer de changer légèrement ta méthode d'identification, à savoir conserver simplement le .htpasswd et gérer le reste en php :
- Si le dossier "/photos_privées/" contient un .htpassword, tu vérifies la présence de la variable de session "photos_privées"
- S'il n'existe pas tu affiches un formulaire d'identification qui pour autoriser ou non l'accès en se basant sur les identifiants présents dans le .htpasswd déjà en place avec un code dans ce genre :

Code:
// Par défaut, un répertoire est considéré comme publique
$show = true;

// Répertoire à afficher
$dir = 'photos_prives';

// Chemin du .htpasswd
$file = $dir.'/.htpasswd';

// Vérifie s'il existe un .htpasswd
if ( file_exists($file) ) {
	
	// Si oui, on passe la variable show a false tant que l'identification n'est pas faite
	$show = false;
	
	// Si la session pour le répertoire concernée n'existe pas, on parse le fichier .htpasswd
	if ( !$_SESSION[$dir] ) {
		foreach ( file($file) as $line ) {
		
			// On découpe chaque ligne avec le séparateur ":"
			$identifiants = explode(':', $line, 2);
			
			// On vérifie que le login et le mot de passe correspond à une ligne
			if ( $_POST['login'] == $identifiants[0] && $_POST['password'] == crypt($identifiants[1]) ) {
				
				// Si le login et le mot de passe sont correctes, alors on créé la session et on passe la variable show à true
				$_SESSION[$dir] = true;
				$show = true;
				
				// On arrete de chercher dans le fichier .htpasswd
				break;
				}
			}
		}
	
	// Si la session existe déjà, alors on passe la variable show à true
	else $show == true
	}

// Affichage des photos autorisé
if ( $show == true ) {
	// affichage des photos
	}

// Affichage non autorisé (pas de session ou mauvais identifiants)
else {
	// affichage du formulaire d'identification
	}

Avec ça tu devrais pouvoir facilement adapter l'architecture que tu utilises pour permettre une identification plus simple :)
 
Discussions similaires
Haut