2009-04-30 14 views
3

私はASP.NET MVCを使用してプロジェクトを開始しています。私はteam_idに基づいて承認とロールを処理する最良の方法を理解できません。 私が読んだすべてのブログエントリまたはフォーラム投稿は、常にasp.netメンバーシップを使用してCustomAuthorizeフィルタを使用してグローバルロール( "admin"、 "helpdesk"、 "editor"など)を定義することについて話します。私のアプリケーションの問題は、グローバルな役割がないことです。ユーザーはteam1のマネージャになる予定ですが、チーム2の詳細を編集または表示することはできません。 許可の詳細は - ユーザーはチーム計画とそのチームメートの可用性を確認できますが、他のチームは表示されません - チームマネージャーはチームの詳細を編集できますが、他のチームの詳細は編集できません - 多くの経営者 - ユーザーが1台のまたは多くのチームASP.NET MVCチームごとの承認とロール

ATMの一部にすることができますが、私はこの関係を処理するための3つのテーブルを持っています。最後の手段として

teams --> teams_users <-- users 
team_id #team_id  user_id 
      #user_id 
      isManager? 

、私は彼がログイン時にセッションVARSにおけるユーザの現在TEAM_IDとisManagerの状態を保存するに滑走、およびセッションTEAM_IDがmodel.team_idと同じであるかどうかをチェックしますCustomAuthorizeフィルタを作成しています。別の方法があるかどうかを教えてください。その後、私はあなたが指定しただけのようにデータベースに結びつけるでしょうManagerおよびユーザー - 私はその後、2つの役割を持っているでしょうあなたに

答えて

1

最後に、私は、カスタムルートを作成してしまいました。チームを変更するたびに、{team_id}が更新されます。 さらに、ユーザーが現在のチームのマネージャであるかどうかをチェックする特定のマネージャアクションを保護するための "isManager"フィルタがあります。 あなたのお返事ありがとうございました

1

をありがとうございます。

役割は、その後、各アクションで、私は簡単にチェックすることができ、現在のユーザーを行うだろう(利用者が情報を閲覧することができ、管理者が情報を作成/編集することができます)、各ユーザーが実行できるアクションを制御します。必要な(つまり、ユーザーがチームにアクセスできる)チームでこのアクションを実行します。

0

私は、RoleOrOwnerAuthorizationとRoleOrOwnerAssociatedAuthorizationのようなケースを扱うための2つのカスタム属性を開発しました。 RoleOrOwnerは、システムの現在のユーザーが問題のデータのユーザーIDと同じかどうかを調べます。つまり、自分のデータを表示する権限が与えられています。 RoleOrOwnerAssociatedは、現在のユーザーにデータを関連付ける行がジョイン・テーブルにあるかどうかをチェックします。たとえば、Groups、GroupLeaders、およびUsersを持つことができます。ここでGroupLeadersはGroupsをUsersにリンクする結合テーブルです。グループのデータを表示するには、ViewGroupsロールまたはグループリーダー(グループのIDとIDを持つGroupLeadersの行に示されている)のいずれかにする必要があります。これはとてもうまくいくと思います。

/{team_id}/controller/action/{id} 

{TEAM_ID}、ユーザーがログイン後に設定、カスタムフィルタは、ユーザが各コントローラの上にチームに属していることを確認される。

1

私はあなたのソリューションがよさそうだと思います。

ユーザー1は、チーム1のマネージャであり、チーム2の通常のユーザーです.ViewScheduleは読み取り専用です。管理者のために編集可能です。 ViewScheduleのコード:

これを行うと、ユーザーがチーム2を使用しているとき、彼はそのブロックを完全に逃してしまいます。彼はASP.NETの役割に関する限りマネージャーですが、そのチームのためのものではありません。そうそう

if (User.IsInRole("manager") && isTeamManager(userid)) { } 
else {} 

、我々はisTeamManagerを(呼び出している場合)、我々はすでにUser.IsInRole(「管理者」)が提供する唯一の情報を取得している:いいえ問題、明らかに我々はこのような条件文を組み合わせることはできません

if (isTeamManager(userid)) { } 
else {} 

ここでは、私たちのコードでもロールを使用していません。私はあなたの元のアイデアにこだわっています。