我正在研究一种MVC框架,我正在实现一个简单的ACL权限检查系统。
我想知道是否有人可以解释一下,或者引导我走向这种实施的一些好例子(或批评指责废弃它,无论哪个是必要的)
由于我正在构建使用REST API的框架,因此我创建了两个基本控制器WebController
和ApiController
。
对/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 :(得分:1)
这是检查ApiController
图层中的凭据,但尝试通过避免使用__call()
方法来消除魔法的好主意。是的,这不是你的问题,但如果你想要更好的表现可能会有用。
好吧,您可以像处理请求的安全过滤器一样使用过滤器并检查用户权限。例如,过滤器可以将请求重定向到401错误响应。 这个想法来自Symfony Framework。
此致 威廉。
答案 1 :(得分:0)
我决定采用与我最初提出的方法类似的方法,创建一个Gateway
对象作为Model
的代理。实质上,Gateway
对象包含对Acl
,Request
和Model
对象的引用,并在转发任何方法调用之前对Acl
对象执行检查。 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;
}
这种方法有什么问题可以看出来吗?据我所知,这应该非常有效地达到目的,因为我可以在不同的Acl
和{基于Model
需求的{1}}对象(尽管可能只需要一个Controller
)
此外,我的API调用路由变得简单,因为使用REST / RPC混合架构,API调用可以传递给Acl
,而无需进行修改。