Bug #21560
la date de dernière modification d'un compte est modifiée lors d'une connexion
100%
Description
Du coup sauf s'il n'y a pas eu de connexion entre une modif et une connexion de l'usager on se trouve toujours avec date de modif = date de dernière connexion.
C'est parce qu'au login il y a un .save() :
authentic/src/authentic2/utils.py(400)login() -> auth_login(request, user) venv/local/lib/python2.7/site-packages/django/contrib/auth/__init__.py(117)login() -> user_logged_in.send(sender=user.__class__, request=request, user=user) venv/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py(189)send() -> response = receiver(signal=self, sender=sender, **named) venv/local/lib/python2.7/site-packages/django/contrib/auth/models.py(26)update_last_login() -> user.save(update_fields=['last_login']) > authentic/src/authentic2/custom_user/models.py(236)save() -> sync = not(kwargs.pop('nosync', False))
Fichiers
Révisions associées
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
Bizarre j'étais persuadé que le update_fields évitait ça :/
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
Et j'ai raison https://code.djangoproject.com/ticket/22981 , je ne comprends pas ce qui se passe, il doit y avoir un autre save() ici.
Mis à jour par Frédéric Péters il y a plus de 6 ans
Oui il doit y avoir autre chose, j'ai fait la trace en local trop rapidement sans vérifier et c'est ok; mais par contre en navigant côté gnm c'est généralement le cas.
Mais comme tu dis ça doit être un autre save(), qui viendrait juste un peu avant :
last_login | modified -------------------------------+------------------------------- 2018-01-31 10:23:06.809221+01 | 2018-01-31 10:23:06.781739+01
Je vais tracer côté GNM.
Mis à jour par Frédéric Péters il y a plus de 6 ans
- Catégorie mis à OpenID Connect
Voilà, en authent oidc il y a récupération des attributs et ils sont posés et un save() a lieu :
File "/usr/lib/python2.7/dist-packages/authentic2_auth_oidc/views.py", line 176, in get user = authenticate(access_token=access_token, id_token=result['id_token']) File "/usr/lib/python2.7/dist-packages/django/contrib/auth/__init__.py", line 74, in authenticate user = backend.authenticate(**credentials) File "/usr/lib/python2.7/dist-packages/authentic2_auth_oidc/backends.py", line 231, in authenticate user.save() File "/usr/lib/python2.7/dist-packages/authentic2/custom_user/models.py", line 236, in save
Il y a même toute une série de save(), sur les autres attributs (# new style attributes) :
File "/usr/lib/python2.7/dist-packages/authentic2_auth_oidc/views.py", line 176, in get user = authenticate(access_token=access_token, id_token=result['id_token']) File "/usr/lib/python2.7/dist-packages/django/contrib/auth/__init__.py", line 74, in authenticate user = backend.authenticate(**credentials) File "/usr/lib/python2.7/dist-packages/authentic2_auth_oidc/backends.py", line 236, in authenticate attributes_map[attribute].set_value(user, value, verified=verified) File "/usr/lib/python2.7/dist-packages/authentic2/models.py", line 237, in set_value owner.save(update_fields=['modified']) File "/usr/lib/python2.7/dist-packages/authentic2/custom_user/models.py", line 236, in save
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
- Catégorie
OpenID Connectsupprimé
Je vois, bon la solution ce serait de vérifier avant d'écrire que quelque chose à changer comme le fait le backend LDAP pour éviter des écritures inutiles, ça devrait augmenter les perfs du SSO OIDC d'ailleurs.
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
- Fichier 0001-auth_oidc-only-update-user-s-fields-if-they-changed-.patch 0001-auth_oidc-only-update-user-s-fields-if-they-changed-.patch ajouté
J'en ai profité pour ajouter plus de logs et j'ai déplacé le log des
créations/liens avant les logs de mise à jour des attributs.
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
- Assigné à mis à Benjamin Dauvergne
- Patch proposed changé de Non à Oui
Mis à jour par Emmanuel Cazenave il y a environ 6 ans
Testé que ton test reproduisais le bug.
Pas compris pourquoi tu préfères passer à if not in ...continue
puis un deuxième if, au lieu de simplement rajouter un deuxième terme au if initial.
Mais rien de crucial donc ack.
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
- Statut changé de Nouveau à Résolu (à déployer)
- % réalisé changé de 0 à 100
Appliqué par commit authentic2|1aa16b62e0cbf59541be9ff6e69c2b731ef202f8.
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Fermé
auth_oidc: only update user's fields if they changed (fixes #21560)