Row Level Security mit Entity Framework
Ich versuche schon zu überlegen, wie man Row Level Security implementiert werden konnte, mit dem Entity Framework. Die Idee ist, eine Datenbank-agnostisch bedeutet, dass sich anbieten würde, Methoden zum einschränken der Zeilen kommen aus dem ObjectContext.
Einige meiner anfänglichen Ideen haben sich beteiligt, ändern die partiellen Klassen angelegt, die von der EDMGEN Werkzeug ist und hat angeboten, einige begrenzte Unterstützung. Benutzer sind noch in der Lage zu bekommen, um diese Lösung mit Ihren eigenen eSQL-Anweisungen und ein QueryObject.
Ich habe auf der Suche nach einer umfassenden Lösung, die existieren würde, über die Datenbank-Anbieter, so dass es bleiben würde, Agnostiker.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher, dass Sie es tun können. Die wichtige Sache zu tun ist, um zu verhindern direkten Zugang zu dem Objekt-Kontext (Benutzer daran zu hindern den Aufbau Ihrer eigenen ObjectQuery), und statt dem Kunden ein schmaler gateway, innerhalb deren Zugang und mutieren Personen. Wir tun es mit der Entity Repository pattern. Finden Sie eine Beispiel-Implementierung dieser Muster für das entity framework in diesem blog-post. Einmal ist der Schlüssel blockiert den Zugriff auf den Objekt-Kontext. Beachten Sie, dass der Objekt-Kontext-Klasse ist partial. So sollten Sie in der Lage sein, um zu verhindern, dass "unbefugte" bedeutet, dass der Instanziierung, d.h. außerhalb der repository-Montage.
Allerdings gibt es Feinheiten zu beachten. Wenn Sie implementieren row-level-security anzeigen auf einem bestimmten entity-Typ über das repository-Muster, müssen Sie berücksichtigen andere Mittel, mit denen ein client auf die gleichen Entitäten. Zum Beispiel, über Navigations-Beziehungen. Möglicherweise müssen Sie einige dieser Beziehungen private, die Sie tun können, in Ihrem Modell. Sie haben auch die Möglichkeit, die Angabe einer benutzerdefinierten Abfrage oder eine gespeicherte Prozedur für das laden/speichern von Entitäten. Gespeicherte Prozeduren tendenziell DB-server-spezifische, aber SQL geschrieben werden können in einer generischen Art und Weise.
Während ich nicht einverstanden, dass dies nicht getan werden kann mit dem Entity Framework, ich bin einverstanden mit der "do-it-auf dem DB-server" Kommentare, soweit Sie implementieren sollten,Verteidigung in der Tiefe.
Den Ort, wo Sie fügen Sicherheit hängt wirklich davon ab, wer Sie versuchen, zu sichern, gegen.
Wenn, zum Beispiel, dass Sie der Sicherung einer web-site, hinzufügen der Filter auf der Kontext-Ebene ausreichen würde, weil der "Benutzer" in diesem Fall sind auf der web site. Sie haben keine andere Wahl als zu gehen durch Ihren Kontext, da Sie schreiben, wäre die Anwendung völlig gegen den Kontext.
In deinem Fall, klingt es wie "Benutzer", die Sie versuchen zu sichern, gegen die Entwickler. Das ist schon ein bisschen schwieriger. Wenn die Entwickler nicht die Möglichkeit haben, änderungen an der Datenbank selbst, dann haben Sie, um die Sicherheit auf Datenbank-Ebene. Kein Betrag von eSQL-Zugang wird in der Lage sein, um rund um den Datenbank - "Nein" - sagen.
Was Sie zu erreichen versuchen, ist per definition nicht möglich.
Wenn die Sicherheit ist nicht explizit behandelt, indem die zugrunde liegenden Datenbank-Anwendung (SQL-Server, Oracle -, was auch immer), dann ist die standard-tools wie SQL Management Studio wird Schlag rechts an ihm vorbei.
Die besten Sie tun können, ist die Durchsetzung row level security durch Benutzer der Anwendung NUR dann, wenn die Benutzer keinen Zugriff auf die Datenbank über einen anderen Mechanismus.
Finden Sie vielleicht dieser Artikel interessant:
http://msdn.microsoft.com/en-us/magazine/ff898427.aspx
"Verweigern Tisch der Zugriff auf das Entity Framework Ohne dass es zu einer Meuterei"
Fand ich einen Weg, es zu tun mit Postgres und eine Erweiterung namens Schleier. Es funktioniert tatsächlich (entwickelt für) mit
Views
für alle Operationen (select, update,delete,insert) und die überprüfung von Berechtigungen inWHERE
Klauseln. Aber Schleier fügt nur die Mathematik für die effiziente Verwaltung die Erlaubnis, die Informationen im Speicher, anstatt Abfragen es jedes mal. Also mit Schleier, obwohl Sie eine direkte Verbindung zu DBMS haben Sie nur noch die row-level-Zugriff gewährt für Sie.Ich ändern mein Stil mit Schleier in mancher Hinsicht, zum Beispiel, begann ich zu verwenden
Triggers
stattViews
für die Anwendung von Berechtigungen Einschränkungen.Empfehle ich dir die Studie dieser Lösung und versuchen, es anzuwenden, ist die Logik hier.
D. H.: Sie machen einen
select * from table
Abfrage und Sie bekommen gerade, was Sie sind, intent (row level sprechen).