Development #33739
rechercher les utilisateurs via un attribut
0%
Description
L'idée serait de pouvoir lier un utilisateur existant via un attribut, dans l'idée de pouvoir faire la liaison avec par exemple un provisionning externe (LDAP ou autre).
Fichiers
Révisions associées
adapters: factorize user linking (#33739)
add user lookup by attributes (#33739)
adapters: abstract user queryset (#33739)
Historique
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- Fichier 0002-adapters-factorize-user-linking-33739.patch 0002-adapters-factorize-user-linking-33739.patch ajouté
- Fichier 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch ajouté
- Fichier 0003-add-user-lookup-by-attributes-33739.patch 0003-add-user-lookup-by-attributes-33739.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Voili voilou, en espérant que ça passe les tests python3.
Mis à jour par Emmanuel Cazenave il y a presque 5 ans
Un petit mot dans le README sur ce qui est attendu dans LOOKUP_BY_ATTRIBUTES et le fonctionnement associé ? (ça faciliterait en autres la relecture).
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Emmanuel Cazenave a écrit :
Un petit mot dans le README sur ce qui est attendu dans LOOKUP_BY_ATTRIBUTES et le fonctionnement associé ? (ça faciliterait en autres la relecture).
Oui, oui, je voulais voir d'abord si ça buildait en python3, comme je suis en sid je n'ai pas de paquet python3-lasso malheureusement, faudrait un paquet pour buster.
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- Fichier 0002-adapters-factorize-user-linking-33739.patch 0002-adapters-factorize-user-linking-33739.patch ajouté
- Fichier 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch ajouté
- Fichier 0003-add-user-lookup-by-attributes-33739.patch 0003-add-user-lookup-by-attributes-33739.patch ajouté
Voilà avec README.
Mis à jour par Serghei Mihai il y a presque 5 ans
Documenter aussi l'option ignore-case
dans les lookups.
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- Fichier 0002-adapters-factorize-user-linking-33739.patch 0002-adapters-factorize-user-linking-33739.patch ajouté
- Fichier 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch ajouté
- Fichier 0003-add-user-lookup-by-attributes-33739.patch 0003-add-user-lookup-by-attributes-33739.patch ajouté
Avec ignore-case documenté.
Mis à jour par Emmanuel Cazenave il y a presque 5 ans
A titre indicatif, le _link_user
est utilisé qu'un fois, et je trouve pas que ça rende le truc plus clair, je comprendrai mieux un truc comme ça :
provisionning = False if not user: if not utils.get_setting(idp, 'PROVISION'): self.logger.debug('provisionning disabled, login refused') return None provisionning = True user = self.create_user(User) saml_id, link_created = models.UserSAMLIdentifier.objects.get_or_create( name_id=name_id, issuer=issuer, defaults={'user': user}) if not provisionning: return user if user != saml_id.user: self.logger.info('looked up user %s with name_id %s from issuer %s', user, name_id, issuer) user.delete() return saml_id.user try: self.finish_create_user(idp, saml_attributes, user) except UserCreationError: user.delete() return None self.logger.info('created new user %s with name_id %s from issuer %s', user, name_id, issuer) return user
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Emmanuel Cazenave a écrit :
A titre indicatif, le
_link_user
est utilisé qu'un fois, et je trouve pas que ça rende le truc plus clair, je comprendrai mieux un truc comme ça :[...]
Hmm y a pas le code de lookup_by_attributes là, ça donnerait quoi avec ? Parce que finish_create_user faut pas le faire avec le lookup.
Mis à jour par Thomas Noël il y a presque 5 ans
Au niveau de 0002, on a un real_user et un user, c'est real_user qu'on a retourner à la fin donc c'est sur lui qu'il faut jouer le finish_create_user :
user = self.create_user(User) real_user = self._link_user(idp, saml_attributes, issuer, name_id, user)* if user != real_user: .... else: self.finish_create_user(idp, saml_attributes, user) <-- c'est plutôt real_user qu'il faut jouer return real_user
Ou alors, plus lisible pour moi, ça serait :
user = self.create_user(User) real_user = self._link_user(idp, saml_attributes, issuer, name_id, user)* if user != real_user: user.delete() return real_user ... et on continue sur "user" ensuite, on parle plus de son jumeau real_user return user
Globalement, quand tout est ok (utilisateur retrouvé via nameid), je ferais plutôt des logs de niveau debug, par exemple à la place de ce logger.info :
self.logger.info('looked up user %s with name_id %s from issuer %s', user, name_id, issuer)
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- Fichier 0002-adapters-factorize-user-linking-33739.patch 0002-adapters-factorize-user-linking-33739.patch ajouté
- Fichier 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch ajouté
- Fichier 0003-add-user-lookup-by-attributes-33739.patch 0003-add-user-lookup-by-attributes-33739.patch ajouté
Plus à plat, avec des noms peut-être plus clairs.
Mis à jour par Frédéric Péters il y a presque 5 ans
Oui, oui, je voulais voir d'abord si ça buildait en python3, comme je suis en sid je n'ai pas de paquet python3-lasso malheureusement, faudrait un paquet pour buster.
Pourtant https://packages.debian.org/search?keywords=python3-lasso ?
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Ah ben je sais juste pas utiliser apt, un -t testing
m'a sauvé, merci.
Mis à jour par Thomas Noël il y a presque 5 ans
Question que je me pose : et si l'utilisateur obtenu via lookup_by_attributes est déjà référencé dans un UserSAMLIdentifier (c'est-à-dire déjà fédéré avec un autre name_id) ? Je serais dans ce cas pour ne pas le prendre en compte. C'est à dire, au lieu de juste :
users_found = User.objects.filter(**{key: value})
faire :
users_found = User.objects.filter(saml_identifiers=None, **{key: value})
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- Fichier 0002-adapters-factorize-user-linking-33739.patch 0002-adapters-factorize-user-linking-33739.patch ajouté
- Fichier 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch ajouté
- Fichier 0004-adapters-abstract-user-queryset-33739.patch 0004-adapters-abstract-user-queryset-33739.patch ajouté
- Fichier 0003-add-user-lookup-by-attributes-33739.patch 0003-add-user-lookup-by-attributes-33739.patch ajouté
Voilà, au passage j'ai ajouté un commit pour abstraire le queryset des utilisateurs, comme ça on pourra restreindre à une OU dans a2 par exemple, comme pour LDAP.
Mis à jour par Frédéric Péters il y a presque 5 ans
En passant, authentic2-auth-fedict définit aussi son Adapter, qui passe par lookup_user, rien de bien particulier, et pas un soucis si le comportement ne change pas du tout. (ce dont je ne suis pas tout à fait sûr)
~~
pour abstraire le queryset des utilisateurs
Plus clair si c'est appelé get_users_queryset que get_queryset, je trouve.
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
Frédéric Péters a écrit :
En passant, authentic2-auth-fedict définit aussi son Adapter, qui passe par lookup_user, rien de bien particulier, et pas un soucis si le comportement ne change pas du tout. (ce dont je ne suis pas tout à fait sûr)
a2-auth-fedict dépend du comportement normal avec provisionning si on ne définit pas de raccordement par attribut ça doit marcher comme avant.
Plus clair si c'est appelé get_users_queryset que get_queryset, je trouve.
Ok.
Mis à jour par Thomas Noël il y a presque 5 ans
Tu renommes le "get_users_queryset" ? Et ça devrait être ok selon moi.
Mis à jour par Benjamin Dauvergne il y a presque 5 ans
- Fichier 0002-adapters-factorize-user-linking-33739.patch 0002-adapters-factorize-user-linking-33739.patch ajouté
- Fichier 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch 0001-simplify-workflow-in-DefaultAdapter.lookup_user-3373.patch ajouté
- Fichier 0004-adapters-abstract-user-queryset-33739.patch 0004-adapters-abstract-user-queryset-33739.patch ajouté
- Fichier 0003-add-user-lookup-by-attributes-33739.patch 0003-add-user-lookup-by-attributes-33739.patch ajouté
C'était déjà fait, j'avais juste pas poussé ici :/
Mis à jour par Thomas Noël il y a presque 5 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Thomas Noël il y a presque 5 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 81ab8f4c9ee816f4fe066b4d74989915a76bc401 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Thu Jun 6 22:52:22 2019 +0200 adapters: abstract user queryset (#33739) commit 31015e6580b4f7ca300c66f880ae8b281a18a883 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Thu Jun 6 13:52:21 2019 +0200 add user lookup by attributes (#33739) commit f2908b2ef30d249a496b441235f5e7fad3887cd7 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Thu Jun 6 10:59:28 2019 +0200 adapters: factorize user linking (#33739) commit e0c1f5b43cbcd5c2dfe6c73ad4cab65a715d6988 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Thu Jun 6 10:12:14 2019 +0200 simplify workflow in DefaultAdapter.lookup_user() (#33739)
Mis à jour par Frédéric Péters il y a presque 5 ans
- Statut changé de Résolu (à déployer) à Solution déployée
simplify workflow in DefaultAdapter.lookup_user() (#33739)