Aller au contenu

Sujets conseillés

Posté

Bonjour

Jutilise le code qui est présenté dans de nombreux post comme celui-ci : http://www.grummfy.com/Authentification_http_et_php-32 qui utilisent la variable $_SERVER['REMOTE_USER'] pour les Php qui fonctionnent en mode CGI.

Je fais deux accès successifs avec deux identifiants ayant des droits différents.

Au deuxième accès, la variable $_SERVER['REMOTE_USER'] transporte toujours lidentifiant saisi au premier accès, ce qui empêche le deuxième accès.

Sur cette variable, avant le deuxième accès, jai essayé :

- unset($_SERVER['REMOTE_USER'])

- $_SERVER['REMOTE_USER'] = "";

pour arriver à réinitialiser la variable avec lidentifiant du deuxième accès, sans succès.

De toute évidence, je nai pas compris qqechose dans cette authentification Php.

Merci par avance de votre aide.

Francois

Posté

REMOTE_USER contient l'utilisateur qui s'est authentifié auprès d'httpd en fonction de sa config. Le fait d'effacer $_SERVER['REMOTE_USER'] ne change rien (à part le fait que le reste du script ne saura plus qui est connecté).

D'ailleurs, je vois mal comment tu peux avoir fait "deux accès successifs avec deux identifiants"... Quoi qu'il arrive, un client http va rebalancer les mêmes identifiants tant qu'on reste sur le même serveur et dans le même "realm" et qu'on ne lui dit pas le contraire.

Deux solutions:

- soit les URLs sont dans des dossiers différents, avec des .htaccess différents, et un "realm" différente (via AuthName);

- soit tu balances un 401 qui va forcer une nouvelle authentification et permettre à l'utilisateur de saisir de nouveaux identifiants.

Jacques.

Posté

Jacques merci de ta réponse.

Pour le(s) Htaccess, faute de trouver des indications précises, j'en ai installé un seul dans la racine de mon site:


<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
</IfModule>

Est ce que tu veux dire que je pourrais en installer plusieurs? dans chaque dossier à protéger?

Mes deux profils d'utilisateurs accèdent à des dossiers différents.

Ca me permettrait de faire ce que je décrivais, d'avoir deux login successifs par deux utilisateurs de droits différents?

Par avance merci de ton aide.

Francois

Posté

J'avais pas lu le lien, normalement on met le nécessaire pour faire l'authentification dans le .htaccess (directives Auth*), on laisse Apache faire tout tout seul comme un grand, et on récupère juste l'utilisateur authentifié dans REMOTE_USER.

Avec la méthode que tu indiques, il faut:

- que tu utilises un "realm" différent pour les différentes parties de ton site qui ont besoin d'authentification différentes.

- que si l'authentification n'est pas valable (utilisateur non autorisé dans cette section, mot de passe incorrect) tu renvoies aussi un 401 comme dans le cas où il n'y a pas de REMOTE_USER etc. du tout

Jacques.

Posté

Jacques

Merci de ta réponse qui m'intéresse bigrement.

Pour développer un tout petit peu, j'ai 4 profils / niveaux de compétence sur mon site: utilisateur, gestionnaire, ...

Je travaille donc à mettre au point un système dauthentification qui permette à ces 4 profils daccéder à leur périmètre, avec le principe de « qui peut le plus peut le moins ».

Jai donc 4 logiques de contrôle daccès, une par profil ; dans ces logiques, jai un header('WWW-Authenticate: Basic realm="' . $my_message . '"'); où le message est différent.

Je contrôle ensuite la demande dans lun ou lautre des 4 fichiers Htpasswd, suivant le profil.

Quand tu parles de Realm différents, via AuthName, parles tu de qquechose de différent de ce que je décris ?

Aussi, est-ce que je dois avoir un Htaccess avec son rewrite dans chaque dossier à protéger ? ou bien rester avec un seul Htaccess dans la racine ?

Merci de ton aide.

Francois

Posté

Il y a tout plein de façons de faire tout ça. En laissant Apache faire, via des fichiers statiques, via une bdd, en php. En utilisant des dossiers séparés, ou en vérifiant les droits au niveau de chaque script.

Si tu veux utiliser Apache, des fichiers statiques, et des répertoires séparés, la solution la plus simple est probablement:

.htaccess dans chaque répertoire à protéger:

AuthType basic

AuthName whatever

AuthUserFile /chemin/vers/fichier/htpasswd

AuthGroupFile /chemin/vers/fichier/htgroup

require group nom_du_groupe_autorise_a_acceder_a_ce_repertoire

Le fichier htgroup est de cette forme:

groupe1: user1 user2 user3

groupe2: user1 user2 user3 user4 user5

etc.

Tu peux aussi gérer le cas "n'importe qui à partir du moment où il est dans le fichier htpasswd" en utilisant "require valid-user" au lieu de "require group ....".

Avec ça, pas besoin de rewrite, et rien à faire en php (où tu devrais quand même pouvoir récupérer $_SERVER['REMOTE_USER'] si tu en as besoin). Pas besoin de realm (AuthName) différent, puisque le même utilisateur peut se connecter à des zones différentes.

Jacques.

Posté

Jacques

Merci de ta réponse.

Je comprend dans ce que tu dis que la manière Apache classique peut sadresser à des groupes, ce que jignorais jusquici, aussi bien quà des personnes ; ça peut être une solution pour moi.

Néanmoins, jai une question qui reste dans lauthentification Php (qui présente des avantages pour moi).

Quand jai deux accès contrôlés successifs, pourquoi la mire de contrôle daccès nest pas présentée la deuxième fois ? Jai ceci :

accès 1 :

1. la mire, je saisis

2. la variable REMOTE_USER est initialisée: Basic ZnJhbmNvaXM6ZWRnZXdvb2Q=

3. laccès est OK

accès 2 :

4. pas de mire

5. la variable REMOTE_USER: son contenu est inchangé

6. laccès est KO, ce qui est normal puisque ce deuxième accès nécessite des droits différents

Est-il possible de forcer laffichage de la mire la deuxième fois ? Comment ?

Par avance merci de ton aide.

Francois

Posté

Jacques

Ta réponse mintéresse beaucoup mais je ne suis pas sûr de savoir faire.

Le code que jutilise est structuré autour de ça :


if( (isset($_SERVER['REMOTE_USER']) && !empty($_SERVER['REMOTE_USER']))
{
}
else
{
header('WWW-Authenticate: Basic realm="' . $my_message . '"');
header('HTTP/1.0 401 Unauthorized');
}

Le problème du deuxième accès, si je comprend bien, est que le code dans le IF sexécute puisque la variable REMOTE_USER reste initialisée du premier passage.

Alors que, pour envoyer un 401, il faudrait que ce soit le code du ELSE qui sexécute.

Sur quelle piste aller ? Jajoute dans le IF, en seconde partie, le même code que celui qui est dans le ELSE ?

Merci encore de ton aide.

Francois

Posté


utilisateur_authentifie = personne
if (il y a des machins d'authenfication)
{
vérifier les machins d'authentification
s'ils sont bon, utilisateur_authentifie = utilisateur
}
if (utilisateur_authentifie == personne)
{
envoyer 401
}

Jacques.

Posté

Jacques, merci de ta réponse.

Ca y est, mon système fonctionne, j'ai pu envoyer un 401 pour faire apparaître de nouveau au deuxième accès la mire d'authentification.

Mon système est plus compliqué que je l'espérais au début mais ça fonctionne comme je le voulais.

Merci de ton aide précieuse dans ce domaine qui m'était inconnu.

Francois

Posté

bonjour Jacques

Rebondissement, je n'arrive plus à faire apparaître la mire d'accès; j'envoie:


header('HTTP/1.0 401 Unauthorized');

sans rien afficher auparavant.

Est ce suffisant pour envoyer le 401 qui devrait, je crois, lancer la mire ?

Par avance merci.

Francois

Posté

bonjour

Non, ma ligne de code n'était pas suffisante pour provoquer une authentification; j'ai la solution à ce sujet là.

J'ai, je crois, une autre solution qui répond à ma question initiale: comment provoquer une deuxième demande d'authentification quand une première a déjà été exécutée?

Naturellement sans refermer la fenêtre du navigateur, moyen très connu.

Avec:


header('Cache-Control : no-cache');

A votre avis?

Francois

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...