如何检查从Zend Framework到DB的每个查询

时间:2011-07-29 16:56:24

标签: zend-framework zend-db zend-db-select zend-db-profiler

我有一个复杂的报告应用程序,允许客户端登录并查看其客户端数据的报告。应用程序的几个部分使用各种控制器进行数据库调用。我需要确保客户端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
   }
}

问题是,我希望每次运行到服务器的查询都运行...如何将此代码作为应用程序和数据库之间的“包版”?我已经使用Zend_Profiler来查看查询,所以我知道它在某种程度上是可能的,但无法从Profiler代码中识别出来......

我总是可以编写一个身份验证函数并以这种方式传递选定的查询,但是这个全能调用将更容易在所有调用中实现,并且将来会证明。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

它的应用程序设计错误。 您应该使用“服务架构” - 查询的唯一入口点是service。内部的任何检查。

答案 1 :(得分:1)

如果您希望在每个查询上运行此操作,我建议您延长Zend_Db_Select并覆盖要加入的query()assemble()函数你的逻辑。您还需要为其添加一种方式来了解您的$auth对象。

答案 2 :(得分:1)

另一个选择是扩展数据库适配器,以便您可以直接拦截查询。 IMO,您应该尝试在应用程序级别执行此操作。

答案 3 :(得分:0)

根据您的数据库服务器,您可以在数据库端放置跟踪。

以下是Oracle的一个示例:

http://orafaq.com/wiki/SQL_Trace