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
War es hilfreich?

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

Quelle: http://www.tzi.org/~sbartsch/declarative_authorization/master/classes/authorization/reader/authorizationRulesreader.html#m000184

: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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top