16. Authentification et gestion des utilisateurs
16.1 Login(), Logout() et Role()
Pour authentifier les utilisateurs, Karrigell fournit un cadre constitué de trois
fonctions intégrées, Login(), Logout() et Role().
L'implémentation par défaut s'appuie sur une base de données d'utilisateurs gérée
par le script users.ks, dont l'accès est réservé à l'administrateur du site.
Ce script est accessible depuis la page d'accueil, Administration/Gestion des utilisateurs
Les utilisateurs peuvent avoir des rôles différents, retournés par la fonction Role() :
None si l'utilisateur n'est pas connecté
visit si l'utilisateur est connecté comme "visiteur" : il ne peut que voir les pages, mais pas les modifier
edit si l'utilisateur est connecté comme "éditeur" : il peut modifier des données
admin si l'utilisateur est connecté comme administrateur du site
Le script de gestion des utilisateurs permet de modifier la liste des rôles possibles
(lien "Gestion des rôles utilisateurs")
Pour restreindre l'accès d'un script aux utilisateurs ayant certains roles, utilisez la fonction Login(role=liste_de_roles). Quand elle est exécutée, elle vérifie si l'utilisateur est authentifié (en se servant de cookies) ; si ce n'est pas le cas
- une redirection est effectuée vers un script (par défaut
/login.ks/login) qui demande à l'utilisateur d'entrer un identifiant et un mot de passe
- un autre script vérifier que l'identifiant et le mot de passe sont présents dans la base et que le rôle attribué à l'utilisateur correspond au rôle requis
- si oui, une redirection est effectuée vers le script de départ, ou vers un autre chemin qui peut être spécifié comme argument de
Login() : Login(role=["admin"],path="/renvoie_moi_ici_apres_identification")
On peut spécifier un autre script que le script par défaut /login.ks/login en le passant comme argument de la fonction Login() : Login("/utils/custom_login.py") par exemple
Logout() retourne une chaîne avec le lien vers un script de déconnection. Le texte de ce lien est "Logout" par défaut, il peut être spécifié comme argument : Logout("Déconnection"). Si l'utilisateur n'est pas authentifié, une chaîne vide est retournée
16.2 Exemple
Ceci est le script loginTest.ks dans webapps/demo:
def index():
# verifie si l'utilisateur est un administrateur du site
Login(role=["edit","admin"])
# on ne voit les lignes ci-dessous que si Login() a réussi
print "Connecté comme ",Role()
print "<br>",Logout()
Si l'utilisateur n'est pas connecté comme administrateur ou éditeur, Login() redirige vers la page qui demande l'identifiant et le mot de passe
S'il est connecté comme administrateur ou editeur, Login() ne fait rien et le reste de la fonction index() est exécuté : la fonction Role() retourne le rôle courant de l'utilisateur et présente un lien pour se déconnecter
Si l'utilisateur clique sur ce lien, après que le script de déconnection est exécuté, une redirection est effectuée vers le script. Puisque l'utilisateur n'est plus connecté, la fonction
Login() redirige encore vers le formulaire de connection
16.3 Authentification HTTP de base
Karrigell prend en charge l'authentification HTTP de base, une façon de protéger l'accès à
certains fichiers en demandant un identifiant d'utilisateur et un mot de passe. Le serveur reçoit
les données fournies et les enregistre dans les variables globales AUTH_USER et
AUTH_PASSWORD. Si l'utilisateur fournit un couple qui est autorisé par le serveur, la page
lui est envoyée ; si ce couple n'est pas reconnu comme valide on lui en redemande un autre ; si
l'utilisateur annule sa demande un message d'erreur lui est envoyé
Avec Karrigell, l'authentification est gérée à travers la fonction Authentication ;
appeler Authentication(fonctionTest[,royaume,
messageErreur]) où fonctionTest est une fonction sans argument
définie par l'utilisateur qui renvoie vrai si le test d'authentification réussit (en fonction des
valeurs de AUTH_USER et de AUTH_PASSWORD) et faux sinon, royaume est une chaîne contenant le nom du domaine d'authentification (celui qui va apparaître sur la
fenêtre de demande d'identifiant et mot de passe) et messageErreur est la chaîne de
caractères affichée sur le navigateur si l'utilisateur annule sa demande d'authentification.
royaume et messageErreur ont tous les deux des valeurs par défaut
Voici un exemple avec une fonction de test très simple :
<%
def testAuth():
return (AUTH_USER=="proust" and AUTH_PASSWORD=="marcel")
Authentication(testAuth,"Test d'authentification",\
"Désolé, vous n'êtes pas autorisé à accéder à cette page")
%>
Bienvenue, utilisateur autorisé !
Avec une telle fonction de test, si un visiteur trouve un moyen de lire le code source, il
découvrira facilement un couple identifiant/mot de passe valide. Une meilleure solution est
d'utiliser md5 : c'est une fonction qui prend une chaîne de caractères comme argument et qui
retourne un "condensé" de 16 octets. On est sûr que les condensés de deux chaînes différentes seront
différents, et il est impossible de retrouver la chaîne d'origine quand on ne connaît que son
condensé
Une bonne méthode consiste à calculer les condensés md5 de l'identifiant et du mot de passe, et
des les stocker dans un fichier. Le test d'authentification lira ce fichier, calculer les condensés
de AUTH_USER et AUTH_PASSWORD, et retournera vrai si les condensés correspondent
<%
import md5
digests=open("digest.ini","rb").read()
userDigest=digests[:16]
passwordDigest=digests[16:]
def authTest():
return (md5.new(AUTH_USER).digest()==userDigest and \
md5.new(AUTH_PASSWORD).digest()==passwordDigest)
Authentication(authTest,"Test d'authentification",\
"Désolé, vous n'êtes pas autorisé à accéder à cette page")
%>
Bienvenue, utilisateur autorisé !
Voir le script k_password.py, dans le répertoire admin, qui génère un fichier avec les condensés md5 de
l'identifiant et du mot de passe de l'administrateur
|