Mit: attr_accessible mit rollenbasierte Autorisierung
-
16-09-2019 - |
Frage
In meinem Online-Shop, werden die Benutzer erlaubt, bestimmte Eigenschaften ihrer Aufträge ändern (zum Beispiel ihrer Rechnungsadresse), andere aber nicht (zum Beispiel der Entstehung IP-Adresse). Administratoren, auf der anderen Seite, ist erlaubt zu ändern alle , um Eigenschaften.
In Anbetracht diesen, wie kann ich :attr_accessible
richtig mein Auftragsmodell sichern? Oder muss ich es verwenden, um zugänglich zu markieren Sie alle Attribute, die Administratoren ändern können und verzichten auf Order.update_attributes(params[:order])
in den Controller-Aktionen, dass normale Benutzer zugreifen kann?
Lösung
Im Allgemeinen attr_accessible ist nicht das Werkzeug für Sie suchen und Rails kommt nicht mit irgendetwas, dass gebaut tut, was Sie wollen.
Wenn Sie eine fein abgestimmte Kontrolle über wollen, die bestimmte Attribute in einem Modell aktualisieren, können Sie so etwas wie tun könnte:
class Order < ActiveRecord::Base
def update_attributes_as_user(values, user)
values.each do |attribute, value|
# Update the attribute if the user is allowed to
@order.send("#{attribute}=", value) if user.can_modify?(attribute)
end
save
end
end
Dann können Sie Ihre Order.update_attributes(params[:order])
ändern Order.update_attributes_as_user(params[:order], current_user)
und vorausgesetzt, Sie die User#can_modify?
Methode implementieren wahr in den richtigen Fällen zurückzukehren, sollte es funktionieren.
Andere Tipps
Ich hatte das gleiche Problem und jetzt verwende ich dieses Juwel http://github.com/dmitry/ attr_accessible_block
Es ist einfach, und in einiger Produktions Website verwendet.
Ja, werden Sie die Aktionen ändern müssen, so Berechtigungen innerhalb der Aktionen überprüft werden. Der Aufruf Order#update_attributes
wird nicht für den allgemeinen Benutzer arbeiten.
Ich kann keine rollenbasierte Autorisierung Plugin rember, die für etwas, das Sie suchen erlauben würde. Dies liegt daran, diese Plugins zu den Controllern und nicht die Modelle mixin. Sie würden auch in ActiveRecord::Base
mixin müssen für attr_accesible
etc zu überprüfen.