Bester Weg, Berechtigungen durchzusetzen – Controller oder Constraint?

Ich habe ein Plugin, das ein Modell namens server hinzufügt, das ein Feld user_id besitzt. Ich möchte, dass nur der Besitzer des server einen POST-Aufruf tätigen kann (oder sollte es vielleicht ein PUT sein? – die Aktion führt eine Neukompilierung einer Discourse-Instanz über die Kommandozeile auf ihrem Server durch; ich bin mir nicht sicher, was hier die Best Practice wäre.)

In config/routes.rb steht Folgendes:

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

Ist es empfehlenswert, dass matches? in pfaffmanager_constraint.rb die path_parameters[:action] prüft und die Berechtigung dort erzwingt, oder sollte dies in servers_controller.rb geschehen?

Außerdem denke ich, dass ich diesen Pfad eigentlich unter namespace :user verschieben sollte. Vielleicht löst sich das Problem dann von selbst, sobald ich das geklärt habe. Aber das hier funktioniert fast, und ich möchte, dass andere Leute diesen Code ausprobieren können.

Die Rails-Route finden Sie hier:
https://github.com/pfaffman/discourse-pfaffmanager/blob/master/config/routes.rb#L12

Und mein Controller versucht, die Berechtigungen durchzusetzen:

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

Aber mein Test (Spec) liefert einen Statuscode 200 zurück, wenn ein anderer Benutzer den POST-Aufruf tätigt:

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

Ich vermute, ich muss irgendwie dafür sorgen, dass Ember darauf achtet?

1 „Gefällt mir“

Kannst du nicht eine Methode an before_action übergeben, um deine Bedingung zu prüfen?

1 „Gefällt mir“

Ich denke, dass die Berechtigungen im Controller oder in den Constraints durchgesetzt werden müssen. Das Modell weiß meiner Meinung nach nicht, wer es aufruft.

Vielen Dank, dass du dir darüber Gedanken machst.

1 „Gefällt mir“

Ich denke, du brauchst eine Guardian-Methode, um zu prüfen, ob ein Benutzer eine bestimmte Aktion ausführen darf. Zum Beispiel can_upgrade_server?.

Sobald du das implementiert hast, kannst du die Methode guardian.ensure_can_upgrade_server! verwenden, die die Bedingung prüft und eine Ausnahme auslöst – was genau das ist, was du brauchst.

2 „Gefällt mir“

Ooooh! Die Wächter-Methode! Ja! Ich werde mir die ansehen! Danke.

2 „Gefällt mir“

Das einzige Modell, das guardian verwendet, ist das Benutzermodell. Es scheint, dass die meisten Aktionen mit guardian in den Controllern stattfinden.

Zum Beispiel verwendet der Kategorien-Controller ensure_can_create_category, was meiner Meinung nach magisch in lib/guardian.rb erstellt wird.

Aber im Moment verwende ich guardian nicht, da ich Schwierigkeiten habe, herauszufinden, wie man es korrekt instanziiert. In meinem Controller habe ich Folgendes:

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

Und hier sind Spezifikationen, die es testen:

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