Development #62013
API pour permettre de définir/modifier l'héritage d'un rôle
0%
Description
Dans Publik Notification, on a besoin de :
créer les rôles Publik Notification - Admin Ville XXX + Publik Notification - Validateur Ville XXX dans a2 : OK avec les api existantes
Mais aussi,
ces rôles doivent hériter différents éléments :
Ils doivent hériter des permissions des rôles : "Agent" et "Publik Notification Créateur"
ces deux rôles doivent automatiquement avoir comme membres "Publik Notification Administrateur"
Fichiers
Demandes liées
Révisions associées
tests: move api tests in subdirectory (#62013)
tests: add fixture decorator for db fixture with global scope (#62013)
Creating a django_db fixture which persists between tests is not easy,
this decorator simplify it and completely replace pytest.fixture for
this use case.
rbac: add slug and name as implicit natural keys (#62013)
If the natural key is not precise enough, MultipleObjectReturned will be
raised preventing mismatches. But it will help using the API for simple
cases where the name is globally unique.
utils: add NaturalKeyRelatedField class (#62013)
utils: add DjangoRBACPermission DRF's permission class (#62013)
rbac: add helper methods to add/remove permissions from roles (#62013)
rbac: add direct parameter to parents and children methods (#62013)
It will limit the parents/children roles returned to those with a direct inheritance relation.
api: add endpoints to manage role inheritance (#62013)
Historique
Mis à jour par Frédéric Péters il y a environ 2 ans
- Lié à Development #26647: Faire hériter un rôle des permissions d'un autre via l'API ? ajouté
Mis à jour par Benjamin Dauvergne il y a presque 2 ans
- Fichier 0002-tests-move-api-tests-in-subdirectory-62013.patch 0002-tests-move-api-tests-in-subdirectory-62013.patch ajouté
- Fichier 0001-api-reorder-urls-62013.patch 0001-api-reorder-urls-62013.patch ajouté
- Fichier 0004-rbac-add-slug-and-name-as-implicit-natural-keys-6201.patch 0004-rbac-add-slug-and-name-as-implicit-natural-keys-6201.patch ajouté
- Fichier 0008-rbac-add-direct-parameter-to-parents-and-children-me.patch 0008-rbac-add-direct-parameter-to-parents-and-children-me.patch ajouté
- Fichier 0009-api-add-endpoints-to-manage-role-inheritance-62013.patch 0009-api-add-endpoints-to-manage-role-inheritance-62013.patch ajouté
- Fichier 0005-utils-add-NaturalKeyRelatedField-class-62013.patch 0005-utils-add-NaturalKeyRelatedField-class-62013.patch ajouté
- Fichier 0003-tests-add-fixture-decorator-for-db-fixture-with-glob.patch 0003-tests-add-fixture-decorator-for-db-fixture-with-glob.patch ajouté
- Fichier 0007-rbac-add-helper-methods-to-add-remove-permissions-fr.patch 0007-rbac-add-helper-methods-to-add-remove-permissions-fr.patch ajouté
- Fichier 0006-utils-add-DjangoRBACPermission-DRF-s-permission-clas.patch 0006-utils-add-DjangoRBACPermission-DRF-s-permission-clas.patch ajouté
- Statut changé de En cours à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Paul Marillonnet il y a presque 2 ans
- 0003 dur à relire malgré la docstring qui explique l’usager de la fixture créée. Je suis descendu dans les patches suivants pour comprendre comment ça s’utilisait, ok.
- dans les signatures de fonction, la délimitatian arguments positionnels, /, arguments mixtes, *, arguments par mot-clé -> on déprécie de fait buster (car pas compatible python < 3.8). J’ai l’impression que c’est trop tôt, non ?
- 0005 le nouveau fichier authentic2/utils/api.py, j’aurais plutôt vu un dossier authentic2/api/{utils, views, urls}.py (qui contiendrait les anciens api_views et api_urls), mais ok pourquoi pas comme ça.
- 0006 dans la nouvelle classe DjangoRBACPermission :
-> j’ai loupé l’endroit où ça nous était utile (?)def __call__(self): return self
- 0006 toujours, pourquoi dans test_method_delete, dans la fonction lambda on a besoin de rajouter "and obj is mock_obj" contrairement aux autres tests. Je ne vois pas à la relecture du tests les cas où cette condition serait fausse.
- 0007 : peut-être un test pour chacune des deux méthodes ajoutées ? :)
- Et du détail, mais peut-être inverse les deux
if
dans chacune des deux méthodes créées ? Le premierif
va créer l’opération pour rien si le secondif
échoue (rbac_utils.get_operation fait un get_or_create).
- Et du détail, mais peut-être inverse les deux
- 0008 du détail encore : est-ce qu’on aurait pas intérêt à mettre
direct is not None
etannotate=True
mutuellement exclusif ? On s’en fiche de l’annotation dans ce cas ci, c’est seulement lorsque direct is None que cela nous intéresse. - 0009 :
url(r'^roles/(?P<role_uuid>[0-9a-z]{32})/[…]')
mais juste en dessousurl(r'^roles/(?P<role_uuid>[\w+]*)/[…]')
-> pourquoi cette variation dans le format du paramètre d’uuid de rôle accepté ?- RolesParentsAPI.get :
direct = None if 'all' in self.request.GET else True
-> pas de moyen d’avoir les membres indirects seulement en un seul appel, est-ce grave ? (On peut décider que non, osef). - même remarque pour RolesParentsRelationshipsAPI.
Mis à jour par Benjamin Dauvergne il y a presque 2 ans
Paul Marillonnet a écrit :
Ok, une première relecture :
- 0003 dur à relire malgré la docstring qui explique l’usager de la fixture créée. Je suis descendu dans les patches suivants pour comprendre comment ça s’utilisait, ok.
- dans les signatures de fonction, la délimitatian arguments positionnels, /, arguments mixtes, *, arguments par mot-clé -> on déprécie de fait buster (car pas compatible python < 3.8). J’ai l’impression que c’est trop tôt, non ?
Ça ne concerne pour l'instant qu'une fonction dans les tests, on a python3.9 sur jenkins.entrouvert.org, ça ne me semble pas gênant, après peut-être y-a-t-il encore des gens en buster sur leur bécane mais ça me parait une bonne occasion de monter en bullseye pour eux.
- 0005 le nouveau fichier authentic2/utils/api.py, j’aurais plutôt vu un dossier authentic2/api/{utils, views, urls}.py (qui contiendrait les anciens api_views et api_urls), mais ok pourquoi pas comme ça.
Je vais laisser ça là pour l'instant mais je n'ai rien contre du rangement autour des APIs.
- 0006 dans la nouvelle classe DjangoRBACPermission :
[...] -> j’ai loupé l’endroit où ça nous était utile (?)
En fait django-rest-framework attend un constructeur dans permission_classes, et donc pour utiliser une instance, histoire d'avoir un truc configurable et pas statique comme les autres permissions genre IsAuthenticated
il faut qu'elle soit appelable, c'est ça ou passer functools.partial(DjangoRBACPermission, <paramétrage>)
, ça me semble plus joli comme ça.
- 0006 toujours, pourquoi dans test_method_delete, dans la fonction lambda on a besoin de rajouter "and obj is mock_obj" contrairement aux autres tests. Je ne vois pas à la relecture du tests les cas où cette condition serait fausse.
Je teste les permissions sur les objets, alors je vérifie que DjangoRBACPermission appelle bien request.user.has_perms en passant l'objet.
- 0007 : peut-être un test pour chacune des deux méthodes ajoutées ? :)
Ok, fait sur la branche.
- Et du détail, mais peut-être inverse les deux
if
dans chacune des deux méthodes créées ? Le premierif
va créer l’opération pour rien si le secondif
échoue (rbac_utils.get_operation fait un get_or_create).
Ok, fait sur la branche.
- 0008 du détail encore : est-ce qu’on aurait pas intérêt à mettre
direct is not None
etannotate=True
mutuellement exclusif ? On s’en fiche de l’annotation dans ce cas ci, c’est seulement lorsque direct is None que cela nous intéresse.
Ok, fait sur la branche, avec des tests en plus dans tests/test_a2_rbac.py.
- 0009 :
url(r'^roles/(?P<role_uuid>[0-9a-z]{32})/[…]')
mais juste en dessousurl(r'^roles/(?P<role_uuid>[\w+]*)/[…]')
-> pourquoi cette variation dans le format du paramètre d’uuid de rôle accepté ?
Aucune raison, corrigé sur la branche.
- RolesParentsAPI.get :
direct = None if 'all' in self.request.GET else True
-> pas de moyen d’avoir les membres indirects seulement en un seul appel, est-ce grave ? (On peut décider que non, osef).
Je ne vois pas de cas d'usage, en général on veut les enfants direct (pour la gestion) ou tout (pour l'audit).
- même remarque pour RolesParentsRelationshipsAPI.
Même réponse.
Branche à jour.
Mis à jour par Paul Marillonnet il y a presque 2 ans
- Statut changé de Solution proposée à Solution validée
Ok, j’ai refait un tour des patches, c’est bon pour moi.
Mis à jour par Benjamin Dauvergne il y a presque 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 13b117319ffefa2920f7ae8c6bc22a005d226497 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Fri May 6 11:35:23 2022 +0200 api: add endpoints to manage role inheritance (#62013) commit 477bc0cb7edd8b83588c0627a94fc190076abb6c Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Mon May 9 16:00:46 2022 +0200 rbac: add direct parameter to parents and children methods (#62013) It will limit the parents/children roles returned to those with a direct inheritance relation. commit df780cafebc08622a577f00af77efc65caca555b Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Mon May 9 15:58:16 2022 +0200 rbac: add helper methods to add/remove permissions from roles (#62013) commit b2ae1973787340e87afa202640ff7d31800bd1b7 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Mon May 9 16:03:20 2022 +0200 utils: add DjangoRBACPermission DRF's permission class (#62013) commit fdf7374113cb13cdf7a35114dc8eda03c97ce08b Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Sun May 8 21:21:59 2022 +0200 utils: add NaturalKeyRelatedField class (#62013) commit cedbbf4514918cb8d2a67f9432d4983e3b2d68c2 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Mon May 9 15:59:43 2022 +0200 rbac: add slug and name as implicit natural keys (#62013) If the natural key is not precise enough, MultipleObjectReturned will be raised preventing mismatches. But it will help using the API for simple cases where the name is globally unique. commit 1c619b8947b5adffbff59ca0142866f8a414dd5c Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Wed May 11 20:04:44 2022 +0200 tests: add fixture decorator for db fixture with global scope (#62013) Creating a django_db fixture which persists between tests is not easy, this decorator simplify it and completely replace pytest.fixture for this use case. commit f72b98efa89acdac8f6e086191f65fa14de9ad6e Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Sun May 8 11:47:58 2022 +0200 tests: move api tests in subdirectory (#62013) commit 2dfd0f5a443a76f10dc4f2252b748c8d5365bf16 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Thu May 5 18:51:34 2022 +0200 api: reorder urls (#62013)
Mis à jour par Transition automatique il y a presque 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
api: reorder urls (#62013)