2

私は個人的なプロジェクトのために NHibernate をいじったり、学んだりし始めたばかりで、何かを「得られていない」と感じています。私はアプリが次のように機能することに慣れています:

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

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

繰り返しますが、UpdateCustomer メソッドは、この顧客を更新できることを確認します。わかりましたが、NHibernate を使用して顧客を更新するには、単純に FirstName を設定します。すべて透過的であるため、Update を呼び出す必要はありません。それが 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 を使いたいのですが、間違った方法で使いたくないのです。ヘルプ!:)

4

1 に答える 1

0

セキュリティの質問については、NHibernateInteceptorのドキュメントを参照してください。インターセプターを使用すると、セッションライフサイクルに接続して、探している機能を有効にすることができます。

2番目の問題は、リポジトリを作成し、必要な機能のみを公開する理由です。アプリケーションがRemoveAll関数を必要としない場合(そしてほとんどの場合は必要ありません)、それを公開しないでください。

于 2009-03-31T16:36:52.160 に答える