2011-02-28 65 views
0

我正在研究一种MVC框架,并且正在实现一个简单的ACL权限检查系统。在API级别进行ACL检查,基于每个方法

我想知道如果任何人都可以摆脱一些光,或直接向我这种实现的一些很好的例子(或批评正当理由的点杀它,无论是必要的)

因为我在构建REST API框架时,我创建了两个基本控制器,分别为WebControllerApiController。到/index.php路线作出WebController_*

请求,并请求/api/index.php路线作出ApiController_*

的扩展WebController负责从模板建筑量与从统一调用必要ApiController小号返回的数据。

扩展的ApiController负责查询数据的Model。如果直接拨打/api/index.php,则返回JSON

但我离题了;为了促进ACL,我认为在ApiController图层上实现它是有意义的,并且如果有拒绝,它将返回JSON或备份到WebController并根据请求类型进行相应处理。

我在想简化的事情,我可以利用__call()私人方法。 __call()将验证所请求的方法的存在性,并且在调用它之前,检查针对ACL的方法的用户权限。

class ApiController{ 

    public function __call($method, $arguments){ 
     if(method_exists($this, $method)){ 
      //haven't written ACL classes yet, but something like this 
      if(ACL::check(...)){ 
       return call_user_func_array(array($this, $method), $arguments); 
      }else{ 
       return false; 
      } 
     }else{ 
      //throw catchable exception or something 
     } 
    } 

} 

好主意?馊主意?思考?也许我在这里头,我仍然在学习,这对教育而言比利润更多,但是完成将来使用的东西会很好。

回答

0

我决定采取一种类似于我最初提出的方法的方法,创建一个Gateway对象作为Model的代理。本质上,Gateway对象拥有对Acl,RequestModel对象的引用,并在将任何方法调用转发给Model之前对对象执行检查。简化为简洁:

public function __call($method, $arguments){ 
    // check request data against acl 
    if($this->_acl->check($this->_request, $method, $arguments)){ 
     // on success, send request in and forward method to model 
     $this->_model->setRequest($this->_request); 
     return call_user_func_array(array($this->_model, $method), $arguments); 
    } 
    // acl check failed, no access 
    return false; 
} 

是否有可以用这个方法来见过的任何问题?据我所知,这应该相当有效地达到目的,因为我可以在基础上Controller的需求不同AclModel对象子(尽管可能只会有一个单一Acl的需要)

此外,由于使用REST/RPC混合体系结构,API调用的路由变得简化,因此可以将API调用传递给Gateway,而无需进行修改。

1

这是检查ApiController图层中凭据的一个不错的主意,但尝试通过避免__call()方法来消灭魔法。是的,这不是你的问题,但如果你想要更好的表演,可能会有用。

好了,你可以使用过滤器安全过滤其处理请求并检查用户的权限。例如,过滤器可以将请求重定向到401错误响应。 这个想法来自Symfony Framework

Regards, William。

+0

**感谢William **;我试图避免硬调用ACL检查方法,无论是在ApiController方法调用之前还是在ApiController方法调用中。我一直在阅读Observer模式,也许这就是我应该采取的方向。 '__call()似乎是一个好主意,但如果还有其他方法来强制这种行为,我就会全神贯注。 – Dan 2011-02-28 23:11:19

+0

是的观察者模式是一个不错的方式。在PHP中这是一个很好的实现:[Event dispatcher](http://components.symfony-project.org/event-dispatcher/)。 – 2011-02-28 23:15:24

相关问题