1

許可システムのオーバーホールが必要なアプリケーションを持っています。

このアプリケーションには、保護が必要な 2 種類の「エンティティ」があります。

  • ユーザー
  • 企業

ユーザーは単純で、アプリケーション内の領域へのアクセスを許可するロールを持っているだけで、データは変更されません。

企業は、管理 (現在は製品を所有する単なる「マスター」企業)、パートナー (製品の再販業者)、および標準 (製品を使用しているだけの人) の 3 つのタイプのいずれかになります。

この製品には、企業の「グループ」という概念もあります。再販業者は製品を別の名前で販売できますが、すべてのデータを一度に表示できる必要があるからです。したがって、各会社は常にグループに属し、各グループは会社によって所有されます。

データをクエリするとき、いくつかの要件があります。

  • 再販業者 A に属するユーザーがデータをクエリすると、再販業者が所有するすべてのグループのすべての会社が表示される必要があります。
  • 標準的な会社 B に属するユーザーがデータをクエリすると、自分の情報のみが表示されます。
  • 管理会社 C に所属するユーザーがデータをクエリすると、すべてが表示されるはずです。
  • 最後に、表示される実際のデータを会社の種類でフィルター処理する必要があります。管理会社は再販業者よりも多くのデータを参照し、再販業者は標準的な会社よりも多くの情報を参照します。

さて、現在のシステムは実際にこれのほとんどを行っていますが、それはたくさんあります:

List<int> groups;
if(CompanyType == CompanyType.Reseller){
  groups = [some list of groups]
}else{
  ....
}

これはかなり醜く、エラーが発生しやすいものです。

SubSonic、WCF (システム全体が REST インターフェイスで設計されています)、PostSharp、および C# を使用しているため、利用可能なツールをご存じでしょう。

制限が適切かつ自動的に設定されるように、フレームワーク レベルでこのレベルの詳細 (基本的に行と列) でアクセス許可を実装する良い方法を誰かが提案できますか?

4

1 に答える 1

0

私は同様の問題に取り組みました。基本的に、私の擬似アルゴリズムは次のとおりです。

IEnumerable<MyData> allDatas = DataAccessLayer.GetDatas();
IEnumerable<MyData> filteredDatas = RuleEngine.Filter(allDatas);
// filteredDatas contains only the datas that the user is authorized to view

まず、たとえばデータベースからすべての製品を取得します。次に、ビジネス ルールでそれらをフィルタリングします。おそらく、いくつかのパラメータを RuleEngine.Filter に追加する必要があります: 現在のユーザー、およびおそらくいくつかのコンテキスト情報。

20 個の製品を取得するには、次のようなコードを記述できます。

IDataReader reader = GetReader();
var products = new List<Product>();
while(reader.Read() && products.Count < 20)
{
    var product = BuildProduct(reader);
    if(RuleEngine.Filter(new Product[] { product }).Any())
        products.Add(product);
}
于 2012-04-25T14:39:35.787 に答える