私は PHP アプリケーションに取り組んでおり、いくつかのオブジェクトにアクセス制御を追加したいと考えています。この質問は言語固有のものではないと感じているため、この質問に PHP のタグを付けませんでした。
「サービスクラス」があるとします
abstract class Service {
}
多くのサービスがこれを基本クラスとして使用します。疑似例の 1 つを次に示します。
class Companies extends Service {
function getCompanyInfo($id) {
//...
}
}
後で、アクセス制御を追加したいと思います。サンプルの「getCompanyInfoById」メソッドは「読み取り」操作であるため、これには「読み取り」権限が必要です。
この時点で、次の方法でこれを実装できます。
- アクセス制御を Service クラスに追加します。すべてのメソッド (getCompanyInfoById など) は、操作を完了して結果を返す前に、「hasPrivilege」メソッドを内部的に呼び出す必要があります。
- 内部オブジェクトでメソッドを呼び出す前に権限をチェックするある種の Proxy オブジェクトですべての Service オブジェクトをラップします。
- アクセス制御を完全に分離し、「呼び出し元」にメソッドを呼び出す前に権限を確認させます。
すべてのオプションの短所:
- これには、すべてのサービスを変更する必要があり、アクセス制御を認識する必要があります。これは関心の分離に反すると思います。
- これにより、ポリモーフィズムなどの OOP 機能が壊れます。呼び出し元は、サービスがサポートするインターフェイスを認識しなくなります。
- これは最も柔軟ですが、パーミッションのチェックが暗黙的に行われるという大きな欠点があります。開発者が「忘れる」か、複雑なコードパスにより、許可されていないサービスが呼び出される可能性があります。
これに完全にアプローチするより良い方法はありますか?