2017-06-11 3 views
0

So das Pundit Juwel Ich bin mit Benutzern erlauben/verbieten Routen zuzugreifen, und es funktioniert für das in Ordnung. Ich habe eine bestimmte Voraussetzung, wo für Benutzer, Admin und Nicht-Admin einen Benutzer erstellen können, aber nur Administrator kann einen Benutzer einschränken (Benutzer sind eingeschränkt, indem Sie restricted_at auf DateTime.now festlegen).Rails/Pundit - Schränken Sie bestimmte Attribute für bestimmte Benutzerrollen

So sind die #create und #update Aktionen erlaubt sowohl von admin/Nicht-Admin zugegriffen werden, aber es ist das spezifische Attribut ich autorisieren möchten.

Meine Optionen sind:

  1. Ich konnte das Modell nur erstellen, sondern gleich Null der restricted_at (falls gesetzt), wenn der Benutzer ohne Administrator

class UserPolicy def create? @record.assign_attributes({restricted_at: nil}) unless @user.admin? return true end end

Aber ich denke nicht, dass dies der beste Weg ist, es zu tun. Ich würde lieber einen Fehler hier zurückgeben. Wenn ich jedoch versuche, einen Fehler wie @record.errors.add(:restricted_at, "can only be set by admin") hinzuzufügen, wird später im Controller, wenn save aufgerufen wird, eine erneute Validierung durchgeführt, und da die Validierungen der Modelle nicht validieren, wer etwas ändert.

Also gibt es einen Weg, dies mit Pundit zu tun? Was ist aus einer Benutzer/UX-Perspektive am sinnvollsten? - Geben Sie 401 nicht autorisiert zurück, wenn ein Nicht-Administrator versucht, einen Benutzer mit restricted_at set zu erstellen oder das Attribut für einen vorhandenen Benutzer zu aktualisieren. Ich persönlich denke, das ist schlecht, weil die Benutzer nicht für die Route nicht autorisiert sind, nur für das Modell. Und eine Decke 401 erklärt nicht, WARUM. - Erstellen Sie das Modell, aber nur nix alles, was ein Nicht-Admin hat zu diesem Attribut, wie ich oben tun - wo einige alternative entweder ich einen Modellfehler mit Pundit hinzufügen (wenn möglich) oder in der Steuerung (weniger ideal, i‘ d eher im Modell oder Pandit alle die Validierung/Erlaubnis Sachen halten. Wenn ich Logik in der Steuerung setzen, dann werde ich Validierungen an drei Stellen haben, das Modell, die Steuerung und Pandit, die mir stinkende scheint)

einfach deutlich zu machen, das sind die Möglichkeiten, aber was ich will, und was ich denke, ist am besten, ist das Modell nicht erstellen (wenn ein nicht admin on erstellen die retricted_at setzt) ​​und schicken sie eine Fehlermeldung.

Wie kann ich das aussortieren? Vielen Dank.

Antwort

0

Eine Möglichkeit, das zu erreichen ist verschiedene Controller und Politik Methoden für Administratoren und Benutzer zu verwenden. Zum Beispiel:

class UsersController < ApplicationController 

    def create 
    @user = User.create(user_params) 
    # ... 
    end 

    def update 
    @user.update_attributes(user_params) 
    # ... 
    end 

    private 

    def user_params 
    params.require(:user).permit(
     # permit only attributes that are accessible by non-admins 
    ) 
    end 
end 

und würde es Admins::UsersController mit Aktionen, die alle verfügbaren Parameter akzeptieren:

class Admins::UsersController < ApplicationController 
    before_action :authorize_user! 

    # ... 

    private 

    def authorize_user! 
    authorize @user, :admin_manage? 
    end 

    def user_params 
    params.require(:user).permit(
     # permit all attributes that are accessible by admins 
    ) 
    end 
end 

Dann in den UserPolicy:

class UserPolicy 
    def admin_manage? 
    @user.admin? 
    end 
end 
Verwandte Themen