0

大規模なシステムは多くのユーザーによって使用されているため、システムにログインして追加の権限を持つことができます。他のユーザーに関する詳細情報を表示する権限や、さまざまなアクションを実行する権限など、権限は異なります。ソフトウェア開発の優れた方法は、デザイン パターンを使用することです。それらの 1 つが MVC (Model-View-Controller) です。だから、私の質問は次のとおりです。モデルのどのレイヤーで権限をチェックする必要がありましたか? そのアプリケーションロジックはユーザーのアクセス許可を検証する必要がありますか、それともおそらくビューレイヤーでいくつかのオプションを非表示/ロック/などにする必要がありますか?

4

1 に答える 1

4

認証と承認は、MVCデザインパターン自体の一部ではありません。また、基本的なMVCビルディングブロックのいずれにも直接責任はありません。

探索できる解決策は、アクセス制御をデコレータに配置することです。

インスタンスを作成しContainerます。このインスタンスに、オブジェクト(コントローラー、ビュー、またはモデルレイヤーからのサービスのいずれか)と承認マネージャーなどを挿入できます。次に、元のオブジェクトであるかのように、このコンテナのメソッドを呼び出します。アクセスマネージャでコールがクリアされた場合は、メソッドを実行します。それ以外の場合は、例外を発生させます。

残念ながら、コード例はPHPです。これは、私の「母国語」だからです。

$something = new SomeThing;
$data = $something->getSensitiveData(); // will simply return all the information

$accessCheck = new AccessManager( .. some dependencies .. );
$something = new Container( $something, $accessCheck );
try 
{
    $data = $something->getSesitiveData(); 
    // will return all information if you pass the authorization.
} 
catch ( AccessDeniedException $e )
{
    // do something
}

このアプローチにはいくつかの利点があります。

  1. アクセス管理は一元化されています
  2. そのようなコンテナに任意のインスタンスを注入できます
  3. OCP違反は発生しません
  4. 開発中に承認の追加を延期しましょう

このようなデコレータでの「ラッピング」は、通常、インスタンスを作成するファクトリ内で発生します。

MVCトライアドのどの部分をラップする必要があるかについて。ええと...通常はコントローラーをラップするだけで十分です(特にWebのコンテキストでMVCを操作する場合)。ただし、残りのコードベースをどのように構成するかによっては、サービス(モデルレイヤーのクラス/インスタンスのグループ)にもこの種の承認チェックを追加するのが妥当な場合があります。

重要なのは、このアプローチには粒度に制限がないということです。このタイプのアクセス制御は、任意のオブジェクトに追加できます。そのオブジェクトのソースコードにアクセスできない場合でも。

于 2013-01-31T16:28:40.253 に答える