2009-03-31 5 views
2

Ich fange gerade an, mit NHibernate herumzuspielen/zu lernen für ein persönliches Projekt, und fühle mich, als würde ich nicht etwas "bekommen". Ich bin daran gewöhnt, Apps wie folgt zu haben:NHIbernate und Sicherheit/Business Layer

Darstellungsschicht -> Business-Schicht -> Persistenzschicht. So würde beispielsweise meine Präsentationsebene BusinessLayer.GetCustomer (ID) aufrufen. Bei dieser Methode würde ich überprüfen, ob der Anrufer das Recht hat, den Kunden zu holen. OK, das funktioniert immer noch gut mit NHibernate. Meine Frage ist jedoch, wie habe ich Sicherheit für Updates, Hinzufügen und Löschen? Angenommen, ich möchte den Kunden ändern, den ich zurückerhalten habe. Normalerweise hätte ich das getan:

customer.FirstName ="Mike"; 
BusinessLayer.UpdateCustomer(customer); 

Wieder würde die UpdateCustomer-Methode überprüfen, dass Sie diesen Kunden aktualisieren können. OK, aber mit NHibernate, um den Kunden zu aktualisieren, werde ich einfach den Vornamen festlegen. Ich brauche dann nicht Update zu rufen, da alles transparent ist. Das ist der Punkt von Hibernate richtig: "Transparente und automatisierte Persistenz." Wie also habe ich meine Sicherheitskontrollen mit dieser Transparenz eingerichtet? Ich traue mir einfach nicht genug, um nicht einen Fehler zu machen und mache so etwas wie:

List<string> customerNames = new List<string>(); 
foreach (Customer c in GetCustomersThatLikeStuffThatILike()) { 
    string custName=""; 
    c.CustomerName = custname; //Oops. I meant to say: custname = c.CustomerName; 
    customerNames.Add(custName); 
} 

Oops. Ich habe gerade alle Kundennamen in der Datenbank gelöscht. Ist das erfunden? Ja. Wenn ich jetzt eine BusinessLayer-Überprüfung durchführen würde, würde dies nur eine Ausnahme auslösen, da dieser Benutzer die Namen anderer Benutzer nicht aktualisieren kann.

Ein anderes Problem. Angenommen, ich bin ein Admin und kann wirklich alles tun, im System, und ich habe Code wie folgt:

//Display a customers orders that haven't shipped yet: 
var Orders = Customer.Orders; 
Orders.RemoveAll(order => order.HasNotShipped); 
Grid.DataSource = Orders; 
Grid.DataBind(); 

OK, also hier wollte ich nur die Befehle filtern, aber ich endete zufällig auf sich aus der Datenbank zu löschen . Die Transparenz hat mich dazu gebracht, etwas sehr Schlechtes zu tun. Wie mindert man dieses Risiko?

ich wirklich wollen NHibernate verwenden, aber ich nicht tun wollen, dass es die falsche Art und Weise zu tun. Hilfe! :)

Antwort

0

Für Ihre Sicherheitsfrage, schauen Sie sich den NHibernate Inteceptor documentation an. Mit Interzeptoren können Sie sich in den Sitzungslebenszyklus einklinken und die gesuchte Funktionalität aktivieren.

Das zweite Problem ist, warum Sie Repositorys erstellen und nur die Funktionalität verfügbar machen, die Sie benötigen. Wenn eine Anwendung die RemoveAll-Funktion nicht benötigt (und die meisten nicht), legen Sie sie nicht offen.

+0

Ich habe die Interceptor Zeug gesehen. Ich glaube, ich war neugierig, ob das andere Entwickler verwenden. Soweit entferne, vielleicht missverstehe ich dich. In meinem Beispiel wird Orders einfach als IList zurückgegeben. Wenn Sie Dinge aus diesem IList entfernen, werden sie nicht aus der Datenbank gelöscht? – aquinas

+0

Es hängt davon ab, wie Sie Ihre Sitzung verwalten. Wenn Ihre Repository-Schicht alle Datensätze zurückgibt und dann die Sitzung schließt, führt das Löschen aus der Liste nichts zur Datenbank. Ihr Repository würde dann Methoden zum Löschen von Daten bereitstellen. – DoniG