Tout le monde connait l'authentification http fournie par apache que l'on met en place aisément avec un fichier .htaccess. Vous trouverz tous les détails sur la doc d'apache. Ce type de protection a l'avantage d'être standard mais aussi de protéger tout le contenu d'un répertoire, contrairement aux sessions php.
Mais la question que l'on se pose est comment mettre fin à cette "session" ? Une solution pour le moins bancale est de proposer au visiteur de fermer son navigateur. On oublie tout de suite. Les visiteurs utilisant firefox et l'extension web developer peuvent le faire aussi aisément sans fermer leur navigateur en cliquant sur:
Miscellaneous > Clear Private Data > Clear HTTP Authentification.
Cette solution n'est pas non plus une solution satisfaisante. Tout le monde n'utilise malheureusement pas encore firefox!
Il n'y a alors pas de solution comme nombreux le prétendent (ils se reconnaitront et ne resteront peut-être pas dans leur ignorance!), allant jusqu'à me modérer parce que j'avais l'affront de prétendre que c'était possible. C'est dur de reconnaitre que l'on a tort et c'est plus facile de ramener la cavalerie pour essayer d'enfoncer la personne qui met un coup de pied dans la fourmillière.
Revenons à nos moutons. Imaginons que nous voulions protéger un répertoire de données confidentielles. En supposant que la configuration d'apache nous y autorise - c'est-à-dire qu'il n'y ait aucun AllowOverride None, il suffit de placer dans le répertoire un fichier .htaccess contenant:
AuthType Basic
AuthName "Private Access By Invitation Only"
AuthUserFile /absolute/path/to/pass.db
Require valid-user
Ce type de protection n'est pas conseillé. On ne met pas le fichier de mot de passe dans le répertoire à protéger; c'ets juste pour la démonstration!
Il faut ensuite créer un fichier de mot de passe avec l'utilitaire htpasswd. J'y ai placé l'identifiant nico avec comme mot de passe nico. On va placer dans ce répertoire un fichier test.php nous donnant le couple identifiant/mot de passe que l'on a entré. Ce couple est accessible à travers le tableau $_SERVER au moyen des clés PHP_AUTH_USER et PHP_AUTH_PW. Je vais aussi créer un script logout.php qui va permettre de mettre fin à cette authentification http. Cette déconnexion se fait en envoyant au navigateur un code http 401 (authentificaiton requise), le même code qu'apache envoie au navigateur à la première tentative d'accès au répertoire. Le code ressemble à ceci:
<?php
header('WWW-Authenticate: Basic realm="Private Access By Invitation Only"');
header('HTTP/1.0 401 Unauthorized');
echo 'Texte affiche en cas d\'annulation';
exit();
?>
Vous pouvez maintenant aller voir mes données confidentielles (login: nico mot de passe: nico). Déconnectez-vous, désormais vous ne pouvez plus voir les données confidentielles. Vous pouvez cliquer sur annuler si ça vous chante mais vous serez tout de même déconnecter! N'essayer pas directement d'accéder au répertoire car vous auriez un accès non autorisé car par défaut ma configuration n'autorise pas de lister les répertoires (Options -Indexes)
Notez bien que le realm doit être le même que celui déclaré dans le .htaccess!
1 De Palleas -
Merci pour cette methode ;-)
2 De Isidore -
Comme tu es fort !
:)
3 De patrick -
Bonjour
Quand je me suis branché sur ton espace sécurisé j'ai eu droit à la demande du login et mot de pass normale. Mais quand j'ai voulu me deconnecter j'ai eu droit aussi à la demande du login/mot de passe mais ce dernier n'a pas marché.
Ce que je recherche c'est quand quelqu'un clique sur mon lien deconnexion il soit ramené à la page d'accueil de mon site et qu'il ne puisse pas rentrer directement par le lien qui s'affiche dans laz barre d'adresse quand tu rentres avec le login et mot de passes.
@+
4 De Maldini -
Salut,
je demande la même chose qu'a demandé Patrick. J'ai bien cherché malheuresement j'ai rien trouvé.
5 De serge -
hello,
sous IE7, la deconnexion ne s'effectue pas et
6 De Jimmy -
Salut
La déconnexion ne se fait correctement car elle redemande login+pass mais lorsque ceux-ci sont rentrés correctements, l'authentification ne se fait pas.
Je pense qu'il vaut mieux passer par les sessions