大規模なシステムは多くのユーザーによって使用されているため、システムにログインして追加の権限を持つことができます。他のユーザーに関する詳細情報を表示する権限や、さまざまなアクションを実行する権限など、権限は異なります。ソフトウェア開発の優れた方法は、デザイン パターンを使用することです。それらの 1 つが MVC (Model-View-Controller) です。だから、私の質問は次のとおりです。モデルのどのレイヤーで権限をチェックする必要がありましたか? そのアプリケーションロジックはユーザーのアクセス許可を検証する必要がありますか、それともおそらくビューレイヤーでいくつかのオプションを非表示/ロック/などにする必要がありますか?
1 に答える
認証と承認は、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
}
このアプローチにはいくつかの利点があります。
- アクセス管理は一元化されています
- そのようなコンテナに任意のインスタンスを注入できます
- OCP違反は発生しません
- 開発中に承認の追加を延期しましょう
このようなデコレータでの「ラッピング」は、通常、インスタンスを作成するファクトリ内で発生します。
MVCトライアドのどの部分をラップする必要があるかについて。ええと...通常はコントローラーをラップするだけで十分です(特にWebのコンテキストでMVCを操作する場合)。ただし、残りのコードベースをどのように構成するかによっては、サービス(モデルレイヤーのクラス/インスタンスのグループ)にもこの種の承認チェックを追加するのが妥当な場合があります。
重要なのは、このアプローチには粒度に制限がないということです。このタイプのアクセス制御は、任意のオブジェクトに追加できます。そのオブジェクトのソースコードにアクセスできない場合でも。