1

クライアントがログインしてクライアント データのレポートを表示できる複雑なレポート アプリケーションがあります。アプリケーションには、さまざまなコントローラーを使用してデータベース呼び出しが行われるセクションがいくつかあります。クライアント A がヘッダー操作によってクライアント B の情報を取得しないようにする必要があります。

システムが認証し、clientID と roleID を割り当てます。roleID >1 の場合は、データをホストしている会社で働いていることを意味し、すべてのクライアント情報を表示できます。基本的に次のように機能するキャッチオールを作成したいと思います。

    if($roleID > 1) {

    ...send query to database

   }else {
     if(...does this query select a record with clientID other than my $auth->clientID){
     do not execute query
  }else {
   execute query
   }
}

問題は、サーバーに送信されるすべてのクエリに対してこれを実行することです...このコードをアプリケーションとDBの間の「障害物」として配置するにはどうすればよいですか? 私はすでに Zend_Profiler を使用してクエリを調べているので、何らかの形で可能であることはわかっていますが、プロファイラーのコードからこれを識別することはできません...

私はいつでも認証関数を作成し、選択したクエリをそのように渡すことができますが、このキャッチオールはすべての呼び出しで実装するのが簡単で、将来的にも保証されます. どんな助けでも大歓迎です。

4

4 に答える 4

1

これがすべてのクエリで実行したいものである場合は、または関数Zend_Db_Selectのいずれかを拡張して上書きし、ロジックに追加することをお勧めします。また、オブジェクトを認識する方法を追加することもできます。query()assemble()$auth

于 2011-07-29T21:05:46.650 に答える
1

もう 1 つのオプションは、データベース アダプタを拡張して、クエリを直接インターセプトできるようにすることです。IMO、ただし、アプリケーションレベルでこれを試してください。

于 2011-07-29T21:09:24.600 に答える
0

データベース サーバーによっては、DB 側にトレースを配置できます。

Oracle の例を次に示します。

http://orafaq.com/wiki/SQL_Trace

于 2011-07-29T17:00:29.953 に答える