diff --git a/README.md b/README.md index 00c76a4..07c87bd 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,11 @@ AUTHENS_USE_OLDCAS = False Il peut être utile de définir ce paramètre. -## Création d'utilisateurices +## Utilisation + +À lire + +### Création d'utilisateurices AuthENS maintient une tables des comptes clipper connus. Cette table est automatiquement mise à jour lors qu'une personne se connecte via @@ -111,7 +115,9 @@ def create_user_view(requests, cas_login: str): ``` -## Migration depuis `django_cas_ng` +## Utilisation avancée + +### Migration depuis `django_cas_ng` Pour migrer depuis `django_cas_ng`, il est recommandé de faire une [data migration](https://docs.djangoproject.com/en/3.1/howto/writing-migrations/#migrating-data-between-third-party-apps) @@ -138,3 +144,21 @@ def migrate_user(user: User): user=user, cas_login=user.username, entrance_year=entrance_year ) ``` + +### Utilisation des signaux + +Authens émet le signal `authens.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 class `User` par défaut); + +- `instance` : l'utilisateurice concerné⋅e; + +- `created` : un booléen valant `True` si 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. diff --git a/authens/backends.py b/authens/backends.py index f1f0ba8..f464969 100644 --- a/authens/backends.py +++ b/authens/backends.py @@ -2,6 +2,7 @@ from django.contrib.auth import get_user_model from django.db import transaction from authens.models import CASAccount, OldCASAccount +from authens.signals import post_cas_connect from authens.utils import get_cas_client, parse_entrance_year UserModel = get_user_model() @@ -94,6 +95,7 @@ class ENSCASBackend: if entrance_year is None: raise ENSCASError("Entrance year not available") + account_created = False with transaction.atomic(): try: user = UserModel.objects.get(cas_account__cas_login=cas_login) @@ -114,6 +116,15 @@ class ENSCASBackend: CASAccount.objects.create( user=user, entrance_year=entrance_year, cas_login=cas_login ) + account_created = True + + post_cas_connect.send( + UserModel, + instance=user, + created=account_created, + cas_login=cas_login, + attributes=attributes, + ) return user # Django boilerplate. diff --git a/authens/signals.py b/authens/signals.py new file mode 100644 index 0000000..7cd5d61 --- /dev/null +++ b/authens/signals.py @@ -0,0 +1,5 @@ +import django.dispatch + +# Envoyé depuis authens.backends.ENSCASBackend +# Doc dans le README. +post_cas_connect = django.dispatch.Signal()