Mehrere Bedingungen für den Benutzer in deklarativ_authorisierung if_attribute
-
25-10-2019 - |
Frage
Ich habe 4 verschiedene Zugangsstufen; Administrator, Partner, Mitarbeiter und Kunde. Administrator, Partner und Mitarbeiter haben administrativen Zugriff auf Kunden. Grundsätzlich habe ich eine Rails -App erstellt, in der Kunden Dokumente in ihren Anbieter (Partner) hochladen können. Bis auf den Zugriff auf Kundenebene funktioniert alles großartig. Ich habe zwei Codes; Partercode und Clientcode. Partner können nur Dateien sehen, bei denen das Partercode -Feld der Datei dem Partnercode des Partners entspricht. Das funktioniert gut. Der Client kann jedoch nur Dateien sehen, in denen der Partnercode übereinstimmt und der Clientcode übereinstimmt. Unten ist mein Kundenabschnitt. Was funktioniert, ist, dass der Kunde nur die Partercode -Dateien sehen darf, aber er setzt ihn auf, die zum Partner gehören. (Durch Eingabe der Nummer in der URL). Ich bezweifle, dass dies jemals ein Problem sein würde, aber es ist ein Sicherheitsloch, das ich definitiv geschlossen möchte.
role :client do
has_permission_on [:users], :to => [:client, :edit, :update] do
if_attribute :username => is { user.username }
end
has_permission_on [:documents], :to => [:client, :new, :create]
has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
if_attribute :partnercode => is { user.partnercode }, :clientcode => is { user.clientcode }
end
end
Lösung 2
Ich fand die Antwort. Die Antwort war ironischerweise in den Tags dieser Frage; verschachtelt.
role :client do
has_permission_on [:users], :to => [:client, :edit, :update] do
if_attribute :username => is { user.username }
end
has_permission_on [:documents], :to => [:client, :new, :create]
has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
if_attribute :clientcode => is { user.clientcode } do
if_attribute :partnercode => is { user.partnercode }
end
end
end
Sobald ich validiert habe, dass der Clientcode korrekt ist, erstellen Sie ein anderes DO. Beenden Sie den Partnercode.
Andere Tipps
Ich denke nicht, dass ich das nistet if_attribute
Aussagen funktionieren tatsächlich so. Deklarativ_authorisierung standardmäßig verbindet sich diesen if_attribute
Aussagen mit an or
Aussage, aber wenn ich richtig verstehe, möchten Sie, dass sie miteinander verbunden sind and
. Der Weg, dies zu ändern, besteht darin, die festzulegen :join_by
zuschreiben :and
.
role :client do
has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
if_attribute :partnercode => is { user.partnercode }
if_attribute :clientcode => is { user.clientcode }
end
end
:join_by
funktioniert, aber mein Problem damit ist, dass Sie manchmal beide brauchen AND
und OR
. Sie können mehrere wenn Bedingungen in einer einzigen Zeile als unterschiedliche Argumente angeben. Diese werden miteinander miteinander verglichen AND
während jede Linie mit bewertet wird OR
.
role :client do
has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
if_attribute :partnercode => is { user.partnercode },
:clientcode => is { user.clientcode } # These two are evaluated with AND
if_attribute :some_attr => is { some_val }
end
end