Karrigell Documentation

Version 2.4.0 12 04 08

English

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])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