Package: authens
AuthENSLibrairie Django pour l'authentification via le CAS élèves à l'ENS.AuthENS fournit une page de connexion qui laisse le choix entre "Connexion par
CAS" et "Connexion par mot de passe".
De plus, elle gère de façon transparente les potentiels "conflits" deusernameliés aux comptes Django standards non-CAS (1) et aux vieux comptes clippers (2).
Plus précisément :Si un compte clipperdupondest créé alors qu'un compte Django standard
avec leusernamedupondexistait déjà, le compte nouvellement créé
obtient unusernamedifférent (typiquementdupond2).
La personne détentrice du compte continue de se connecter en tant quedupondsur le CAS élèves mais devra utiliser le nomdupond2lorsqu'elle
choisira d'utiliser la connexion par mot de passe sur le site, typiquement
après la fin de la scolarité lorsque le compte clipper est supprimé.Si, quelques années plus tard, après queduponda terminé sa scolarité, le
SPI donne le logindupondà une nouvelle personne, AuthENS détecte que le
nouveau comptedupondn'est pas le même que l'ancien et crée un nouveau
compte (par exempledupond3).
Le comptedupond3peut se connecter par CAS en tant quedupondet le
comptedupond2ne peut plus se connecter que par mot de passe.ConfigurationUrlsVous devez rendre les pages de connexion de AuthENS accessibles, par exemple en
ajoutant dans votre fichier d'urls :urlpatterns=[...path("authens/",include("authens.urls")),...]La page de connexion principale de AuthENS est ensuite accessible via l'url
nomméeauthens:login.
La page de déconnexion estauthens:logout, il est important d'utiliser cette
vue est non la vue de déconnexion par défaut de Django pour déconnecter du CAS
en plus du site.Dans le fichiersettings.pyAjouter"authens"dans lesINSTALLED_APPS.Ajouter"authens.backends.ENSCASBackend"dans lesAUTHENTICATION_BACKENDS.
SiAUTHENTICATION_BACKENDSn'apparaît pas dans vos settings, utiliser :AUTHENTICATION_BACKENDS=["django.contrib.auth.backends.ModelBackend","authens.backends.ENSCASBackend",]Préciser l'url de connexion:LOGIN_URL=reverse_lazy("authens:login")(Optionnel) Par défaut AuthENS propose les 3 modes de connexion (CAS / Vieux
compte CAS / mot de passe). Les modes de connexion "Vieux compte CAS" et
"mot de passe" peuvent être désactivés en ajoutant :AUTHENS_USE_OLDCAS=FalseAUTHENS_USE_PASSWORD=False(Optionnel) Il est possible d'autoriser la connexion via CAS pour les membres
destaffs, lorsque cette option est activée, leur promotion est fixée à 0,
lorsque l'option est désactivée, une tentative de connexion renvoie une erreur
car le format de$HOMEn'est pas valide.AUTHENS_ALLOW_STAFF=True(Optionnel) AuthENS utilise le paramètre Django standardLOGIN_REDIRECT_URLpar défaut pour rediriger l'utilisateurice en cas de connexion réussie.
Il peut être utile de définir ce paramètre.UtilisationÀ lireCréation d'utilisateuricesAuthENS maintient une tables des comptes clipper connus.
Cette table est automatiquement mise à jour lors qu'une personne se connecte via
le CAS pour la première fois.
En revanche lorsqu'un nouveau compte est créé manuellement et que ce compte
correspond à un compte clipper, il faut enregistrer ce compte auprès d'AuthENS,
autrement le compte Django et le compte clipper seront considérés comme deux
comptes différents.
Authens fournit une fonctionregister_cas_accountpour cela.Exemple:fromauthens.shortcutsimportregister_cas_accountfromdjango.httpimportHttpResponseRedirectfromyourapp.formsimportUserCreationFormdefcreate_user_view(requests,cas_login:str):ifrequest.method=="POST":form=UserCreationForm(request.POST)ifform.is_valid():user=form.save()register_cas_account(user,cas_login)returnHttpResponseRedirect("success.html")else:form=UserCreationForm()returnrender(request,"create_user.html",{"form":form}Utilisation avancéeModification des templatesIl est possible de supplanter les templates d'authens en activant un répertoire
de templates dans les settings Django, puis de créer un dossierauthensdans
celui-ci. Les templates à substituer sont :authens/login_switch.htmlpour la sélection de la méthode de connexionauthens/pwd_login.htmlpour le formulaire de connexion par mot de passeauthens/pwd_reset.htmlpour le formulaire de demande de réinitialisation de
mot de passeauthens/pwd_reset_confirm.htmlpour le formulaire de réinitialisation de mot
de passeMigration depuisdjango_cas_ngPour migrer depuisdjango_cas_ng, il est recommandé de faire unedata migrationet d'appliquer la fonctionregister_cas_accountsur tou⋅tes les
utilisateurices.Dans le cas où certain⋅es utilisateurices n'ont pas de clipper, on peut d'abord
tester leur existence dans le LDAP du SPI de la façon suivante:fromauthens.modelsimpomrtCASAccountfromauthens.shortcutsimportfetch_cas_accountdefmigrate_user(user:User):# On regarde si `user` existe dans le LDAP du SPIldap_info=fetch_cas_account(user.username)ifldap_info:# Si oui, on enregiste `user` en tant que compte CAS.# Les deux lignes suivantes sont équivalentes à appeler# `register_cas_account(user, user.username)` mais nous économisent une# requête au LDAP.entrance_year=ldap_info["entrance_year"]CASAccount.objects.create(user=user,cas_login=user.username,entrance_year=entrance_year)Utilisation des signauxAuthens émet le signalauthens.signals.post_cas_connectà chaque fois qu'un
compte CAS se connecte. Le signal est envoyé avec les arguments suivants :sender: la classe Django utilisée pour stocker l'utilisateurice
(vraisemblablement la classUserpar défaut);instance: l'utilisateurice concerné⋅e;created: un booléen valantTruesi l'utilisateurice vient d'être créé⋅e
(première connexion);cas_login: le login CAS de la personne;attributes: un dictionnaire contenant des informations supplémentaires sur
le compte, fournies par le CAS.