2009-03-31 16 views
2

NHibernateを個人的なプロジェクトとして学び始めたばかりです。私は何かを "得ていない"と感じています。私はアプリが次のように動作することに慣れています。NHIbernateとセキュリティ/ビジネス層

プレゼンテーションレイヤー - >ビジネスレイヤー - >パーシスタンスレイヤー。たとえば、私のプレゼンテーション層はBusinessLayer.GetCustomer(id)を呼び出します。その方法では、呼び出し元に顧客を取得する権利があることを確認します。 OK、それはまだNHibernateでうまく動作します。私の質問にもかかわらず、私はどのように更新、追加、および削除に関するセキュリティを持っていますか?たとえば、戻った顧客を変更したいとします。通常、私はこれをしたでしょう:

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

また、UpdateCustomerメソッドは、この顧客を更新できることを確認します。 OK、しかしNHibernateを使って、顧客を更新するために、単にFirstNameを設定します。私はそれがすべて透明だから、更新を呼び出す必要はありません。それがHibernateの右のポイントです。「透過的で自動化された永続性」では、この透明性を備えたセキュリティチェックをどのようにして準備していますか?私は間違いをしないように自分自身を信用するだけで、次のようなことをしないでください。

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); 
} 

おっと。私はちょうどデータベースのすべての顧客の名前を一掃しました。これは人為的なものですか?はい。さて、もし私が何らかのBusinessLayerチェックをしていれば、そのユーザーは他のユーザーの名前を更新することができないので、例外がスローされます。

別の問題です。私は管理者だと本当にシステムに何かを行うことができますし、私はこのようなコードがあるとしますので、ここで私はちょうど注文をフィルタリングしたい、

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

OK、私は誤ってデータベースから削除することになりました。透明性は私に何か悪いことをさせました。そのリスクをどのように緩和しますか?

私は本当にはNHibernateはを使用したいが、私ははそれを間違った方法を行うにはしたくない。助けて! :)

答えて

0

セキュリティに関するご質問は、NHibernate Inteceptor documentationをご覧ください。インターセプタを使用すると、セッションのライフサイクルに入り込むことができ、探している機能が有効になります。

第2の問題は、リポジトリを作成し、必要な機能だけを公開することです。アプリケーションがRemoveAll関数を必要としない場合(大部分はそうでない場合)は、公開しないでください。

+0

私はインターセプタのものを見ました。私はそれが他の開発者が使っているものなのか不思議であったと思う。限り、removeall、多分私はあなたを誤解しています。私の例では、Ordersは単にIListに返されます。あなたがそのIListから物を取り除いても、それらはデータベースから削除されません。 – aquinas

+0

セッションの管理方法によって異なります。リポジトリ層がすべてのレコードを返してからセッションを閉じると、リストから削除するとデータベースに何も起きません。リポジトリは、データを削除するためのメソッドを提供します。 – DoniG

関連する問題