1

ASP.NET MVC 2 でフランチャイズ サービス ビジネス用の Web ベースの CRM + CMS の 2 番目のイテレーションを構築しています。ユーザーがそのフランチャイズに割り当てられている役割に基づいて、各フランチャイズのサービスへのアクセスを制御する必要があります。

4 つの例:

  • Receptionist彼女の「Atlantic Seaboard」フランチャイズのサービスの仕事を予約できるはずですが、レポートを作成することはできません。
  • Technicianサービス ジョブを変更できる必要がありますが、請求書を変更することはできません。
  • Managers店舗内のジョブの請求書に割引を適用できる必要があります。
  • Owner彼が所有するフランチャイズのレポートを取得できるはずです。

フランチャイズ レベルのアクセス制御は、Data - Services - Web層の間のどこに収まるべきですか?
それが私のコントローラーに属している場合、どのように実装するのが最適ですか?

部分スキーマ

Rolesクラス

int ID { get; set; } // primary key for Role
string Name { get; set; }

部分Franchises授業

short ID { get; set; } // primary key for Franchise
string Slug { get; set; } // unique key for URL access, eg /{franchise}/{job}
string Name { get; set; }

UserRolesマッピング

short FranchiseID; // related to franchises table
Guid UserID; // related to Users table
int RoleID; // related to Roles table
DateTime ValidFrom;
DateTime ValidUntil;

コントローラーの実装

[Authorize]属性によるアクセス制御

関係するフランチャイズが 1 つだけの場合は、コントローラー アクションへのアクセスを次のように単純に制限できます。

[Authorize(Roles="Receptionist, Technician, Manager, Owner")]
public ActionResult CreateJob(Job job)
{
    ...
}

フランチャイズは一夜にして出現するわけではないので、おそらくこれはASP.NET MVC 2の新しいエリア機能を使用する強力なケースでしょうか? または、これはビューの重複につながりますか?

コントローラー、URL ルーティング & エリア

エリアが使用されていないと仮定すると、どのフランチャイズのデータ​​がアクセスされているかを判断する最良の方法は何ですか? 私はこれについて考えました:

{franchise}/{controller}/{action}/{id}

または、詳細(...)アクションでジョブのフランチャイズを決定し、[承認]でユーザーのアクションを制限する方が良いですか:

{job}/{id}/{action}/{subaction}
{invoice}/{id}/{action}/{subaction}

{franchise} パラメータで URL を乱雑にすることなく、ユーザーが複数のフランチャイズにアクセスできる可能性がある場合、これはより理にかなっています。

どんな入力でも大歓迎です。

編集:

バックグラウンド

従来の ASP で以前の CRM を構築したところ、ビジネスは順調に進みましたが、ワークフローを高速化し、エラーの余地を少なくするためにアップグレードする時期が来ました。適切なテストを行い、データとプレゼンテーションをより適切に分離するために、Rob Conery の MVC Storefront シリーズに見られるようなリポジトリ パターンを実装することにしました。

サービスとリポジトリの配置方法は?

JobService利用可能なフィルタに基づいてサービス ジョブを取得する があることは理にかなっています。IQueryable<Job> GetJobs();. しかし、ジョブは 1 つのフランチャイズにのみ属することができるため、 のような機能は、 または のIQueryable<Job> GetJobs(int franchiseID);いずれFranchiseServiceかに属することができJobServiceます。(MVC StorefrontFranchiseServiceのように) として機能する必要がありますか?CatalogService

4

1 に答える 1

0

これに答えてみましょう。私は、言及された側面のいくつかに触れるサンプルアプリで遊んでいる最中です。これは正式な回答ではなく、単なる経験です。

フランチャイズ レベルのアクセス制御は、データ - サービス - Web 層の間のどこに収まるべきですか?

このアクセス制限は、1) データベース 2) アプリケーション層の 2 つのレベルでアプリケーションに浸透する必要があります。MVC コンテキストでは、カスタム Authorization 属性を作成することをお勧めします。これにより、Web サービス レイヤー間のセキュリティが処理されます。この属性に 2 つのことをさせます

  1. ユーザーに許可されている現在のロールを取得します (DB から、ユーザー セッションに格納されている可能性があります)。
  2. ユーザーがロールの許可リストに含まれているかどうかを確認します。データベースに関しては、これはデータの保存方法、すべてのフランチャイズに 1 つのデータベース、またはフランチャイズごとのデータベースによって異なります。最初のケースでは、データへのアクセス制限を特定のフランチャイズに制限および設定する方法がいくつかあります。

フランチャイズは一夜にして現れるものではないため、おそらくこれは ASP.NET MVC 2 の新しいエリア機能を使用する強力なケースでしょうか? または、これはビューの重複につながりますか?

機能を分割してグループ化するには、エリアを使用する必要があると思います。領域を使用してフランチャイズを分割する場合、ここでビュー、コントローラーなどの重複が発生します。重複するビューは、カスタム ビュー エンジンを使用して、MVC がビューを見つける方法を具体的にオーバーライドすることで解決できます。プラグ: ASP.NET MVC に対する私の回答を参照してください: ドメインごとにカスタマイズされた設計

エリアが使用されていないと仮定すると、どのフランチャイズのデータ​​がアクセスされているかを判断する最良の方法は何ですか?

前述のように、ユーザー セッションに、ユーザーが属するフランチャイズや割り当てられたロールなどの基本情報を保存できます。私がどこかで読んだルールは、「コントローラーではなく、アクションを保護する」という行に沿っていると思います

例外ではなく、通常のルートなどを作成します。例えば。現在、ユーザーが複数のフランチャイズにアクセスできるというビジネス ケースはありますか?

サービスとリポジトリの配置方法は?

などの特定のフランチャイズに必要なすべての情報を含む基本サービスまたは基本クラスのセットを用意しますfranchiseId。それが解決する主な問題は、サービスメソッドがfranchiseId引数を持たないよりクリーンであることです。ただし、ある時点で、要求または保存しているデータを明確にする必要があるため、リポジトリはこの値を必要とする場合があります (すべてのフランチャイズに対して 1 つのデータベースを想定しています)。ただし、IoC を使用すると、この問題の一部を克服できます。

私が見るマイナス面は、オブジェクトが作成されるたびにデータベースへの呼び出しが常にあることです (つまり、franchise ルートが使用される場合、サービスオブジェクトを作成するたびに、データベースにアクセスして対応するフランチャイズ ID を取得する必要があります)。 (IoC コンテナーには、これを支援および防止できるいくつかのライフスタイル オプションがあるため、これについては間違っている可能性があります)正しい情報を取得するためのルート値. 答えのこの部分は散らばっていますが、主なことは、IoC が多くの依存関係を切り離すのに役立つということです.

お役に立てれば..

于 2010-04-28T11:12:38.517 に答える