Projet

Général

Profil

Bug #8234

webservice to add/remove users to/from roles

Ajouté par Frédéric Péters il y a plus de 8 ans. Mis à jour il y a plus de 6 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Josué Kouka
Catégorie:
-
Version cible:
Début:
10 septembre 2015
Echéance:
22 novembre 2015
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

To be used by wcs "add/remove role" workflow actions.


Fichiers


Demandes liées

Lié à Publik - Project management #8006: Supprimer la création de rôles dans w.c.s.Fermé03 août 201505 janvier 2016

Actions
Dupliqué par Authentic 2 - Bug #8599: API to add/remove user rolesFermé11 octobre 2015

Actions

Révisions associées

Révision 313e17e4 (diff)
Ajouté par Josué Kouka il y a plus de 8 ans

roles add/remeve member api #8234

Révision 0b1e833c (diff)
Ajouté par Josué Kouka il y a plus de 8 ans

improving role api tests #8234

Révision f9f510c3 (diff)
Ajouté par Josué Kouka il y a plus de 8 ans

roles-api-add_remove-members-#8234

Historique

#1

Mis à jour par Frédéric Péters il y a plus de 8 ans

#2

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

  • Dupliqué par Bug #8599: API to add/remove user roles ajouté
#3

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

  • Assigné à mis à Josué Kouka
#4

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

To give some insight on implementing this ticket:
  • I would use the base URL /api/roles/
  • I would use django-rest-framework
  • I would use the uuid of the role as the first path element (/api/roles/<role.uuid>/)
  • I would use the uuid of the user as the second path element (/api/roles/<role.uuid>/members/<user.uuid>/)
  • I would implement that using the POST verb with an empty content

For the first version access control should be based on HTTP authentication, like the register API, by checking permission to modify the role, user.has_perm('a2_rbac.change_role', obj=role).

#5

Mis à jour par Josué Kouka il y a plus de 8 ans

Fake patch submission.

#6

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Je n'utiliserai pas de Serializer, ça sert surtout s'il y a un payload dans un POST ou un PUT, là on se base entièrement sur l'URL.

Tu peux simplement résoudre user_uuid et role_uuid dans la méthode dispatch:

def dispatch(..., role_uuid, user_uuid):
    self.role = get_object_or_404(Role, uuid=role_uuid)
    self.user = get_object_or_404(User, uuid=user_uuid)
    return super(....
...

Je ne renverrai pas un 404 sur un POST qui réussit parce que l'objet existe déjà, soit un 400 soit un 200. Si quelqu'un a un avis plus éclairé.

Par contre sur un DELETE d'un object qui n'existe pas, je renverrai un 404.

#7

Mis à jour par Josué Kouka il y a plus de 8 ans

#8

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

The "remove user from role" test should fail currently as the user is not part of the role initially; it should returns a 404 status code. The passing test should first add the user to the role then remove it.

I would create a role from scratch instead of using the first found role. I would attach this role to the entity by default to test role 'manager of roles' of this entity.

Also like the registration API tests I would make tests with different kind of users:
  • a super-user as currently,
  • a user having the global role 'manager of roles' defined by Role.objects.get_admin_role(ContentType.objects.get_for_model(Role), None, None).
  • a user having the role 'manager of roles' on the default entity defined by Role.objects.get_admin_role(ContentType.objects.get_for_model(Role), None, None, ou=get_default_ou())
  • a user having the managing role of the new role new_role.get_admin_role(),

In the end you should have 3 (created, delete failure, delete success) * 4 (kinds of users) + 4 (forbidden with anonymous, forbidden with logged having no permission, role not found, user not found) = 16 tests.

Sorry to not have reviewed your patch earlier. Do not hesitate to ping me again next time.

#9

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

  • Version cible mis à 2.2.0
#10

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

  • Statut changé de Nouveau à En cours
#11

Mis à jour par Josué Kouka il y a plus de 8 ans

  • Echéance mis à 20 septembre 2015
#12

Mis à jour par Josué Kouka il y a plus de 8 ans

  • Echéance changé de 20 septembre 2015 à 22 novembre 2015
#14

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Le test de permission doit être fait sur l'objet rôle précis par sur sa classe:

   request.user.has_perm(perm, obj=Role)

ici Role devrait être un self.role à cette occasion je déplacerai tout le code de dispatch() dans initial() on en a besoin là de toute façon et ça fait une méthode en moins.

Ce serait bien de trouver les conditions qui font qu'on reçoit "Vous n\'avez pas la permission d\'effectuer cette action." ou bien "User not allowed to change role".

Apparemment il n'y a que le superuser qui arrive à utiliser l'API, il y a peut-être un souci... (cetainement lié à la remarque plus haut sur la façon de faire le check de permission).

#15

Mis à jour par Josué Kouka il y a plus de 8 ans

Ce serait bien de trouver les conditions qui font qu'on reçoit "Vous n\'avez pas la permission d\'effectuer cette action." ou bien "User not allowed to change role".
Apparemment il n'y a que le superuser qui arrive à utiliser l'API, il y a peut-être un souci... (cetainement lié à la remarque plus haut sur la façon de faire le check de permission).

L'erreur était du au fait que dans mon RolesAPI qui avait en permissions HasUserAddPermissions. J'ai enlevé la permission et tout semble OK.

#17

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Un seul patch please.

#18

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Tu n'as pas pris en compte ma demande de déplacer le code dans dispatch() vers initial(), user.is_superuser or user.has_perm(...) est redondant car has_perm fait aussi un test sur is_superuser.

#19

Mis à jour par Josué Kouka il y a plus de 8 ans

Désolé. C'est fait

#20

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Si tous les tests passent, pousse donc.

#21

Mis à jour par Josué Kouka il y a plus de 8 ans

  • Statut changé de En cours à Résolu (à déployer)
#22

Mis à jour par Benjamin Dauvergne il y a environ 8 ans

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

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

  • Statut changé de Solution déployée à Fermé

Formats disponibles : Atom PDF