Meilleure façon de faire respecter les autorisations - contrôleur ou contrainte ?

J’ai un plugin qui ajoute un modèle, server, avec un champ user_id. Je veux que seul le propriétaire du server puisse effectuer une requête POST (ou peut-être devrais-je utiliser PUT ? — l’action déclenchera une reconstruction en ligne de commande d’une instance Discourse sur son serveur ; je ne suis pas sûr de ce qui serait la meilleure pratique.)

Dans config/routes.rb, voici ce qui est défini :

post “/upgrade/:id” => “servers#queue_upgrade”, constraints: PfaffmanagerConstraint.new

Est-il recommandé de vérifier path_parameters[:action] dans matches? de pfaffmanager_constraint.rb et d’y appliquer les autorisations, ou de le faire dans servers_controller.rb ?

De plus, je pense que ce que je devrais vraiment faire, c’est déplacer cette route sous namespace :user. Peut-être qu’une fois que j’aurai résolu cela, ce problème sera réglé dans le cadre de cette modification. Mais cela fonctionne presque, et j’aimerais passer à une phase où d’autres personnes pourront tester ce code.

La route Rails se trouve ici :
https://github.com/pfaffman/discourse-pfaffmanager/blob/master/config/routes.rb#L12

Et mon contrôleur tente d’appliquer les autorisations :

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/controllers/pfaffmanager/servers_controller.rb#L53-L70

Cependant, mon test (spec) renvoie un code 200 lorsqu’un autre utilisateur effectue la requête POST :

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/spec/requests/servers_controller_spec.rb#L149-L157

Je suppose que je dois trouver un moyen de faire en sorte qu’Ember prenne cela en compte ?

Ne pouvez-vous pas passer une méthode à before_action pour vérifier votre condition ?

Je pense que les permissions doivent être appliquées dans le contrôleur ou via les contraintes. Le modèle ne sait pas qui l’appelle, je crois.

Merci beaucoup d’avoir réfléchi à cette question.

Je pense que vous avez besoin d’une méthode de garde pour vérifier si un utilisateur est autorisé à effectuer une action donnée. Par exemple, can_upgrade_server?.

De plus, une fois cela fait, vous pouvez utiliser la méthode guardian.ensure_can_upgrade_server! qui vérifie la condition et lève une exception, ce qui est exactement ce que vous recherchez, selon moi.

Ooooh ! La méthode Guardian ! Oui ! Je vais les consulter ! Merci.

Le seul modèle qui utilise guardian est le modèle utilisateur. Il semble que la plupart des actions liées à guardian se situent dans les contrôleurs.

Par exemple, le contrôleur des catégories utilise ensure_can_create_category, qui, selon moi, est généré de manière magique dans lib/guardian.rb.

Mais pour l’instant, je n’utilise pas guardian car je rencontre des difficultés pour comprendre comment l’instancier correctement. J’ai ceci dans mon contrôleur :

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/controllers/pfaffmanager/servers_controller.rb#L54-L75

Et voici des spécifications qui le testent :

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/spec/requests/servers_controller_spec.rb#L154-L181