1

私が達成しようとしていることについてのフィードバックを本当にいただければ幸いです。

問題:

  1. アプリケーションのユーザーに、コントローラーでの1つのアクションを許可したいと思います。例:ユーザーは、必要な権限を持っている場合、私のコントローラークラスで「保存」アクションを実行できます。
  2. 私が取り組んでいるプロジェクトでは、役割の作成とその承認はクライアント展開チームによって行われ、私の管理下にはありません。そのため、ロール/ユーザーに割り当てることができる「コントロールポイント」にプログラムしますが、アプリケーションはそのコントロールポイントをチェックするだけで済みます。
  3. コントロールポイントの概念をASP.NetMVCに組み込むにはどうすればよいですか?具体的には、コントローラーのユーザー権限に基づいてビューのボタンを有効/無効にするにはどうすればよいですか?

私の解決策:

  1. 参照:http : //weblogs.asp.net/fredriknormen/archive/2008/03/12/asp-net-mvc-framework-2-interception-and-creating-a-role-action-filter.aspx-as出発点
  2. 上記のリンクで説明されているようにロールフィルターを作成する代わりに、モデルを取得して承認チェックを行うControlPointFilterクラスを作成します。
  3. 私が抱えている問題はViewクラスにあり、現在、ユーザーがViewData[]コレクションでアクセスできるコントロールポイントコレクションを渡しています。
  4. Viewクラスで、関連するコントロールポイントがViewDataコレクションに存在するかどうかを確認しています(これは好きではありません-Viewクラスのコードを最小限に抑えたい)
  5. もう1つの問題は、実際のコントロールポイント名がコントローラークラスの属性に設定されているときに、これらの属性をビューに渡し、ビューをクリーンに保つにはどうすればよいですか?

これに答えるためのあなたの時間/努力に役立ち、感謝することを願っています!

サニー

4

2 に答える 2

1

これに対する考えられる解決策の 1 つは、コントローラー アクションでコントロール ポイントをビュー属性に変換することです (おそらくこれらは同じものですが、質問からは明らかではありません)。アイデアは、コントロール ポイントが「AllowEdit」、「AllowSave」、「AllowDetailedView」などの意味のあるビュー方向に変換されるというものです。これらは ViewData のエントリになります。

基本コントローラー クラスを使用して Controller を拡張し、それに ControlPoint コレクションを与えます。フィルターでこのコレクションをコントローラーに入力します。ベース コントローラーの OnActionExecuted メソッドでこのコレクションを使用し、ViewResult の場合は、ビュー ディレクティブのコレクションの適切な値を ViewData に設定します。個々のコントローラー アクションは、ControlPoint コレクションを使用して、ビューが余分なデータをレンダリングするかどうかに基づいて、個々のビューにデータを提供する必要があるかどうかを判断することもできます。

ビューでは、コントロール ポイント自体ではなく、ベース コントローラーによって決定されるビューの方向に依存します。このようにして、コントロール ポイント ロジックからビューを切り離しました。ビューは、アプリケーションのコンテキストで意味を持つ許可ベースのデータではなく、ビューにとって意味のある方法でビュー データのみを操作します。ビューは、特定のディレクティブが設定される方法や理由に関係なく、ディレクティブの値に基づいて適切にレンダリングするだけで済みます。

于 2009-05-17T16:18:54.597 に答える
0

うーん、ユーザーに役割を割り当てるために、単純にテンプレートシステムを作成することはできませんか?つまり、「CustomerService」と「ConfigurationEditor」の役割を持つユーザーテンプレート「PowerUser」を作成し、通常どおり役割システムを使用します(つまり、Roles.IsUserInRole(username、rolename))?

アクションの場合は、次を使用します

[Authorized(Roles="CustomerService,CustomerServiceAdmin")]
public ActionResult Edit(...)
{
}

ビューには、

<% if (Roles.IsUserInRole(Context.User.Name, "CustomerService")) %>
于 2009-05-17T15:45:27.110 に答える