2009-07-07 14 views
2

Ich habe rails_authorization_plugin und läuft mit Modellen.Wann und wo zu implementieren ACL

Wie lassen sich die Berechtigungsprüfungen auf meiner Website am besten implementieren?

Ich habe komplizierte Bedingungen für, wenn eine Instanz eines Objekts sichtbar sein sollte, gibt es eine effiziente Möglichkeit, sie zusammen zu ketten, so dass ich nicht mehrere Datensätze abrufen und meine DB als Ergebnis der Schleife über zurückgegebene Daten um es zu filtern?

Antwort

1

Es gibt einen effizienten Weg: stellen Sie sicher, dass Sie nur eine Abfrage ausführen, und dass die von Ihnen ausgeführte Abfrage genau die gewünschten Objekte zurückgibt. Leichter gesagt als getan, natürlich.

Eine Möglichkeit, dies zu handhaben, besteht darin, Ihre Bedingungen mithilfe von Bereichen zu erstellen.

@posts = @thread.posts.not_deleted.this_week.not_secret 

Wenn alle diese Methoden Bereiche sind, wird dies nur eine Abfrage sein.

Wenn Ihre Bedingungen zu komplex sind, um sie leicht zu Bereichen zu machen, sollten Sie wahrscheinlich einfach eine Methode schreiben, um die sichtbaren Objekte für den Benutzer zurückzugeben.

class User 
def posts_for(thread) 
    if is_admin? 
    thread.posts 
    elsif thread.owner == self 
    thread.posts.not_deleted 
    else 
    Post.find(:all, :conditions => something_complicated(thread, self)) 
    end 
end 
end 

Meine Anwendung hat viele Arten von Objekten und sehr komplizierter Berechtigungen, so dass wir erfassen Anrufe wie das mit method_missing, und sie an eine Erlaubnis Bibliothek, die weiß, wie man all die verschiedenen Anfragen zu machen.

+0

Nun, ich benutze das Rails-Acl-Plugin, das ziemlich prägnant ist, aber ich glaube nicht, dass ich es in Ketten verwenden kann, kann ich? Gibt es ACL-Plugins, die sich fast wie eine Erweiterung von ActiveRecord verhalten? Die Dokumentation für Schienen acl gibt eine Menge zu beginnen, aber die Durchführung von Sicherheitskontrollen lässt mich mit viel Rätselraten. Vielen Dank für Ihre Hilfe, wirklich gute Tipps hier schon! –

+0

Ich bin mir nicht sicher, welche Bibliothek Sie verwenden, vielleicht verknüpfen Sie sie? Ich kenne den Bereich der Berechtigungsbibliotheken nicht wirklich. Ich habe meine eigene Berechtigungsbibliothek gerollt, weil unsere Rollen auf Granularität auf Objektebene und nicht auf Granularität auf Anwendungsebene basieren. Daher funktionierten die Plugins nicht wirklich für mich. –

+0

Haben Sie sich rails_acl_plugin angesehen? Es tut Instanz, Klasse und Methode Berechtigungen. –

Verwandte Themen