2

MVCのどのレイヤー(モデル、ビュー、コントローラー)でパーミッションロジックを処理する必要がありますか?

それを少し明確にしましょう。明らかに、UI(ビューとコントローラー)は、コンポーネントを表示/非表示にし、アクセス許可が拒否されたシナリオを処理するために、アクセス許可にアクセスできる必要があります。また、モデル層によってアクセス許可をデータベースに永続化する必要があることも明らかです。

しかし、このような「複雑な」許可ルールについてはどうでしょうか。
私が開発しているwiki/CMSシステムでは、各ユーザーはページごとの権限(表示、編集、名前変更など)のセットを持っています。既存のページの場合、これらの権限はデータベースから取得されます。新しいページの場合、ユーザーは(ページを作成/編集するときに)可能なすべての権限を持っていると見なされます。

もう1つの例は、ページのリストです
。現在のユーザーは、ページのリストで表示権限を持っているページのみを表示できる必要があります。

コントローラはこのロジックを処理する必要がありますか?または、コントローラーはGetPermissions()メソッド(またはGetPageList)の呼び出しのみを担当し、それを設定するためのすべてのロジックはモデルで処理する必要がありますか?

4

2 に答える 2

5

問題ドメインエンティティへのアクセスの制御は、モデルに属します。これは、(1)ドメインエンティティへのアクセス制御がエンティティ自体と密接に関連しているため、適切な場所です。(2)2つのコントローラーが同じオブジェクトへの異なるアクセスポリシーを許可しないようにすることができる1つの場所です。

次の要因により、混乱が生じます。

  1. 認証はコントローラーレベルで行われます
  2. アクセス制御を簡単に適用するためのツールとデモがいくつかあります。たとえば、 thisthisthatなどのコントローラーレイヤーで使用できます。

それはまだモデルに属しています。

于 2009-07-16T18:49:53.533 に答える
1

モデルには、ログインしたユーザーの許可/拒否されたアクセス許可に関する情報が含まれている必要があります。次に、コントローラーはモデルに従ってアクションを許可/ブロックする必要があります。同時に、ビューは、ユーザーが実行できるアクションに対応するリンクのみを描画する必要があります。ビューは、モデルに尋ねる特定のリンクをペイントするかどうかを認識します(もう一度)。

防御的なプログラミングを使用する必要があります。特定のユーザーのリンクをペイントせずに、コントローラーのアクションへのアクセスを制御しない場合でも、そのユーザーはアクションを実行できます。一方、クラッシュするアクションのリンクをペイントすると(コントローラーのアクセス許可をチェックするだけの場合)、ユーザーを苛立たせます。

于 2009-07-16T18:48:02.257 に答える