Development #9210
Quand l'idp contrôle les rôles les actions de workflow pour ajouter/soustraire un rôle doivent utiliser le web-service de l'IdP
0%
Description
Pour ajouter un rôle:
POST /api/user/<user.names_identifiers[0]>/<role.slug>/
renvoie toujours 201;
pour supprimer un rôle
DELETE /api/user/<user.names_identifiers[0]>/<role.slug>/
renvoie toujours 200
Fichiers
Demandes liées
Révisions associées
misc: add an http_delete_request helper function (#9210)
wf/roles: handle case when user attributes are managed by the idp (#9210)
If the user's attributes are managed by an idp, we add/remove roles by calling
the idp role management web-services. It only works with authentic2.
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Lié à Project management #8006: Supprimer la création de rôles dans w.c.s. ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Fichier 0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch 0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch ajouté
- Fichier 0002-misc-add-an-http_delete_request-helper-function-9210.patch 0002-misc-add-an-http_delete_request-helper-function-9210.patch ajouté
- Fichier 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch ajouté
- Patch proposed changé de Non à Oui
Pas testé un brin, je ferai un test en déployant manuellement sur montpellier-dev avant de pousser.
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Fichier 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch ajouté
Testé à l'aide du workflow https://eservices-montpellier.dev.entrouvert.org/backoffice/workflows/27/status/2/, de la classe d'authentification du ticket #8896 et de la configuration suivante dans /etc/authentic2-multitenant/config.py:
# Test REST Authentication try: import hobo.rest_authentication REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] += ('hobo.rest_authentication.PublikAuthentication',) except ImportError: print 'Unable to install PublikAuthentication'
J'ai aussi mis en dur dans la classe PublikAuthentication la clé secrète employée par w.c.s. pour signer.
L'ajout/retrait du rôle "Alex Jany" au soumissionnaire du formulaire fonctionne, avec propagation jusqu'à w.c.s. dans les secondes qui suivent.
Le patch numéro 3 a été mis à jour avec la signature des URLs qui manquait.
Mis à jour par Frédéric Péters il y a plus de 8 ans
s/is_idp_manage_user_attributes/is_idp_managing_user_attributes/ (ou does_idp_manage_user_attributes mais j'aime moins).
Même quand c'est le cas, on ne perdrait rien à quand même exécuter le code local.
Mis à jour par Frédéric Péters il y a plus de 8 ans
Et peut-être même alors taper les appels HTTP en afterjob, pour ne pas perdre de temps.
Mis à jour par Thomas Noël il y a plus de 8 ans
Frédéric Péters a écrit :
Même quand c'est le cas, on ne perdrait rien à quand même exécuter le code local.
On gagnerait beaucoup (c'est instantané, si la présence du rôle est nécessaire aussitôt). En fait, il faut absolument le faire.
Mis à jour par Thomas Noël il y a plus de 8 ans
- Echéance mis à 30 décembre 2015
- Statut changé de Nouveau à Information nécessaire
- Priorité changé de Normal à Haut
J'augmente la priorité parce que c'est une fonctionnalité nécessaire dans les workflows d'Alfortville.
(Je laisse non assigné cependant)
Mis à jour par Thomas Noël il y a plus de 8 ans
- Statut changé de Information nécessaire à En cours
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Fichier 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch ajouté
J'ai pris en compte la remarque de Thomas concernant l’inconditionnalité de l'action locale.
Le diff entre l'ancien patch numéro 3 et le nouveau:
diff --git a/wcs/wf/roles.py b/wcs/wf/roles.py index 4834fb9..0a5e200 100644 --- a/wcs/wf/roles.py +++ b/wcs/wf/roles.py @@ -76,10 +76,9 @@ class AddRoleWorkflowStatusItem(WorkflowStatusItem): # we can't work on anonymous or user_hash'ed forms return user = get_publisher().user_class.get(formdata.user_id) + self.perform_local(user, formdata) if user.name_identifiers and is_idp_manage_user_attributes(): self.perform_idp(user, formdata) - else: - self.perform_local(user, formdata) def perform_local(self, user, formdata): if not user.roles:
Mis à jour par Thomas Noël il y a plus de 8 ans
A priori tu as posté l'ancien patch. Sur le nouveau, il faut penser à laisser l'action locale sur le Remove aussi. Avec ça, c'est ack pour moi. (je laisse la main à Fred pour insister sur le s/is_idp_manage_user_attributes/is_idp_managing_user_attributes/ le cas échéant)
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Fichier 0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch 0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch ajouté
- Fichier 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch ajouté
J'ai pris en compte la remarque de Fred sur le renommage et le after_job et aussi l'action locale (et oui j'avais posté le mauvais patch).
Mis à jour par Frédéric Péters il y a plus de 8 ans
Dans 0003, c'est resté is_idp_manage_user_attributes.
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Fichier 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch ajouté
C'est dur la rentrée.
Mis à jour par Thomas Noël il y a plus de 8 ans
Fallait pas prendre de congés.
Et donc, Ack pour moi.
Mis à jour par Frédéric Péters il y a plus de 8 ans
Exception: type = '<type 'exceptions.AttributeError'>', value = ''module' object has no attribute 'urlquote'' Stack trace (most recent call first): File "/home/fred/src/eo/wcs/wcs/wf/roles.py", line 33, in roles_ws_url 31 entity_id = idps.values()[0]['metadata'] 32 base_url = entity_id.split('idp/saml2/metadata')[0] > 33 return urlparse.urljoin(base_url, '/api/roles/%s/members/%s/' % (urllib.urlquote(role_uuid), 34 urllib.urlquote(user_uuid))) 35
Et après ça il yaura le fait que "idps.values()[0]['metadata']" donne le nom du fichier avec les métadata, et pas les métadata.
Peut-être dès lors, pour ne pas creuser trop dans le SAML, simplement avoir un "Role Webservice URL", à l'instar du Registration URL (dans /settings/identification/idp/identities). (?)
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
Frédéric Péters a écrit :
[...]
C'est corrigé depuis le patch du 14 décembre.
Et après ça il yaura le fait que "idps.values()[0]['metadata']" donne le nom du fichier avec les métadata, et pas les métadata.
Idem.
Je pense que tu as testé un vieux patch, le code actuel ressemble à cela:
entity_id = idps.values()[0]['metadata_url'] base_url = entity_id.split('idp/saml2/metadata')[0] url = urlparse.urljoin(base_url, '/api/roles/%s/members/%s/' % (urllib.quote(role_uuid), urllib.quote(user_uuid)))
Mis à jour par Frédéric Péters il y a plus de 8 ans
En effet j'avais appliqué par mégarde un vieux patch.
Cela étant :
Exception: type = '<type 'exceptions.AttributeError'>', value = ''NoneType' object has no attribute 'get_server'' Stack trace (most recent call first): File "/home/fred/src/eo/wcs/wcs/wf/roles.py", line 43, in roles_ws_url 41 urllib.quote(user_uuid))) 42 secret = get_secret(url) > 43 orig = get_request().get_server().split(':')[0] 44 url += '?orig=%s' % orig 45 return sign_url(url, secret)
Et je n'aime guère le entity_id.split('idp/saml2/metadata')[0]
(le "Registration URL" avait été créé pour ne pas dépendre des URL d'Authentic 2); mais je laisserai passer.
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Fichier 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch ajouté
J'ai sorti la construction de l'URL du after_job. Ne pas dépendre des URLs d'authentic2 ? Dans l'hypothèse ou quelqu'un serait ok pour implémenter le même web-service avec le même protocole de signature dans un autre logiciel qu'authentic2... si ça arrive on changera le code.
Mis à jour par Frédéric Péters il y a plus de 8 ans
J'imagine maintenant une dépendance à #8896, non ?
[04/Jan/2016 18:48:06] "POST /api/roles/d100b3f981ef409f8a56d410e8573aeb/members/fred/?orig=auquo&algo=sha256×tamp=2016-01-04T17%3A48%3A06Z&nonce=3e2603f2cc9e4cd44fe765b722ff438c&signature=6UNsPjsJtOrkKvLm/TyT1kOTcxgCxlyAeVK3UTqgfqU%3D HTTP/1.1" 401 58
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
Oui, j'avais le secret espoir que #8896 soit intégré bien avant celui-ci :)
Mis à jour par Frédéric Péters il y a environ 8 ans
Pour le moment ça signe la requête vers authentic avec une clé tirée de [api-secrets]
; afin que les choses soient claires, [api-secrets]
devrait uniquement être utilisé pour la vérification des requêtes s'adressant à l'API de w.c.s.
Pour ça je propose d'intégrer le patch suivant dans le 0003; et puis derrière il faudra adapter le hobo_deploy pour créer et remplir la section [wscall-secrets]
.
Mis à jour par Frédéric Péters il y a environ 8 ans
- Fichier 0001-fixup-9210.patch 0001-fixup-9210.patch ajouté
Mis à jour par Benjamin Dauvergne il y a environ 8 ans
- Fichier 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch ajouté
- Fichier 0004-populate-wscall-secrets-in-check_hobos-9210.patch 0004-populate-wscall-secrets-in-check_hobos-9210.patch ajouté
J'ai mis à jour le 0003 et j'ai crée un patch pour check_hobos pour remplir la section wscall-secrets.
Mis à jour par Frédéric Péters il y a environ 8 ans
(cela étant je préfère qu'on attende que l'authentic avec l'authent rest framework publik se trouve en prod)
Mis à jour par Benjamin Dauvergne il y a environ 8 ans
Voilà l'authentification REST_FRAMEWORK est en prod:
In [1]: from django.conf import settings In [2]: settings.REST_FRAMEWORK Out[2]: {'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', 'hobo.rest_authentication.PublikAuthentication'), 'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend', 'rest_framework.filters.OrderingFilter'), 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',), 'NON_FIELD_ERRORS_KEY': '__all__', 'PAGE_SIZE': 10}
Je pousse ?
Mis à jour par Thomas Noël il y a environ 8 ans
- Statut changé de En cours à Résolu (à déployer)
- Assigné à mis à Benjamin Dauvergne
- Priorité changé de Haut à Normal
commit 6772ebef00c10b135111188b14a38b53b2cbe075 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Sat Dec 5 23:47:17 2015 +0100 wf/roles: handle case when user attributes are managed by the idp (#9210) If the user's attributes are managed by an idp, we add/remove roles by calling the idp role management web-services. It only works with authentic2. commit 9d13b21b69b7b515125e7494baefb22c8fe031d1 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Sat Dec 5 23:33:53 2015 +0100 misc: add an http_delete_request helper function (#9210) commit 790023bd1190aa3478e748ff70917743d1e4677c Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Fri Dec 4 17:35:47 2015 +0100 add helper method to test if user attributes are IdP managed (#9210)
add helper method to test if user attributes are IdP managed (#9210)