既存の製品を完全に書き直しています (PHP から C# に変更中です)。私たちが既存の製品で遭遇した問題の 1 つは認証の問題です。いつでもどこでも確認しないと、許可されていないものが表示されてしまいます。常にチェックされていることを確認するのに最適な場所はどこですか? データレイヤーはこれを行うのに最適な場所だと思いますが、他の提案は大歓迎です。
NHibernate を使用するため、エンティティを提供するクラスを作成しました。次のようになります。
class DataProvider {
TEntity Get<TEntity>(int id) {
return GetSession().Get<TEntity>(id);
}
IQueryable<TEntity> Query<TEntity>()
{
return GetSession().Query<TEntity>();
}
// ...
}
DataProvider.Get<Person>(1)
これにより、を使用して LINQ クエリを呼び出したり実行したりできますfrom person in DataProvider.Query<Person>() select person
。インターセプターを使用すると、ユーザーが権限を持っていない単一のオブジェクトへのアクセスを拒否できます (ただし、そのコードを に挿入することはおそらく可能ですDataProvider.Get
)。LINQを使おうとすると面倒になる。100 万のエンティティを含むテーブルがあり、5 つのエンティティにしかアクセスできないとします。インターセプターを使用すると、テーブル全体が取得され、返された各エンティティがテストされますが、必要なエンティティは 5 つだけです。私が想像できる最善の方法は、カスタム SQL を注入して、取得するオブジェクトを NHibernate に伝え、他のすべてを無視することです。オブジェクトへのアクセス権があるかどうかを判断できるシステムは既に用意されています。それからクエリを作成する方法も知っていると仮定しましょう。
私は何を試しましたか?
- インターセプター (遅すぎます。必要なオブジェクトが 5 つだけなのに、100 万個のオブジェクトを取得します)。
- イベント (IPostLoadEvent は私が必要とするものに最も近いですが、遅すぎます)。
- カスタム NhQueryable および DefaultQueryProvider。これにより例外がスローされます: "
The constant for 'MyQueryable<Person>' is not supported
"。これは、NHibernate の奥深くでキャストされているためだと思います。NHibernate がカスタム クエリ プロバイダまたはクエリ可能を許可するように設計されているとは思えません。 - OnPrepareStatement インターセプター。これは信じられないほど醜いです。SQL を編集できますが、得られるのは文字列だけです。これは機能しますが、同じことを行うもっとエレガントな方法があることを願っています。
他のユーザーは認証コードをどのように処理しますか? 承認チェックの呼び出しを忘れないようにするにはどうすればよいでしょうか?