Projet

Général

Profil

Development #62013

API pour permettre de définir/modifier l'héritage d'un rôle

Ajouté par Frédéric Péters il y a environ 2 ans. Mis à jour il y a presque 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
21 février 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Lié à Authentic 2 - Development #26647: Faire hériter un rôle des permissions d'un autre via l'API ?Fermé24 septembre 2018

Actions

Révisions associées

Révision 2dfd0f5a (diff)
Ajouté par Benjamin Dauvergne il y a presque 2 ans

api: reorder urls (#62013)

Révision f72b98ef (diff)
Ajouté par Benjamin Dauvergne il y a presque 2 ans

tests: move api tests in subdirectory (#62013)

Révision 1c619b89 (diff)
Ajouté par Benjamin Dauvergne il y a presque 2 ans

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.

Révision cedbbf45 (diff)
Ajouté par Benjamin Dauvergne il y a presque 2 ans

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.

Révision fdf73741 (diff)
Ajouté par Benjamin Dauvergne il y a presque 2 ans

utils: add NaturalKeyRelatedField class (#62013)

Révision b2ae1973 (diff)
Ajouté par Benjamin Dauvergne il y a presque 2 ans

utils: add DjangoRBACPermission DRF's permission class (#62013)

Révision df780caf (diff)
Ajouté par Benjamin Dauvergne il y a presque 2 ans

rbac: add helper methods to add/remove permissions from roles (#62013)

Révision 477bc0cb (diff)
Ajouté par Benjamin Dauvergne il y a presque 2 ans

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.

Révision 13b11731 (diff)
Ajouté par Benjamin Dauvergne il y a presque 2 ans

api: add endpoints to manage role inheritance (#62013)

Historique

#2

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é
#3

Mis à jour par Benjamin Dauvergne il y a presque 2 ans

  • Assigné à mis à Benjamin Dauvergne
#4

Mis à jour par Benjamin Dauvergne il y a presque 2 ans

  • Statut changé de Nouveau à En cours
#6

Mis à jour par Paul Marillonnet il y a presque 2 ans

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 ?
  • 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 :
        def __call__(self):
            return self
    
    -> j’ai loupé l’endroit où ça nous était utile (?)
  • 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 premier if va créer l’opération pour rien si le second if échoue (rbac_utils.get_operation fait un get_or_create).
  • 0008 du détail encore : est-ce qu’on aurait pas intérêt à mettre direct is not None et annotate=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 dessous url(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.
#7

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 premier if va créer l’opération pour rien si le second if é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 et annotate=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 dessous url(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.

#8

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.

#9

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)
#10

Mis à jour par Transition automatique il y a presque 2 ans

  • Statut changé de Résolu (à déployer) à Solution déployée
#11

Mis à jour par Transition automatique il y a plus d'un an

Automatic expiration

Formats disponibles : Atom PDF