ACL检查在API级别,基于每个方法

时间:2011-02-28 22:42:08

标签: php model-view-controller acl

我正在研究一种MVC框架,我正在实现一个简单的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
        }
    }

}

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

2 个答案:

答案 0 :(得分:1)

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

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

此致 威廉。

答案 1 :(得分:0)

我决定采用与我最初提出的方法类似的方法,创建一个Gateway对象作为Model的代理。实质上,Gateway对象包含对AclRequestModel对象的引用,并在转发任何方法调用之前对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,而无需进行修改。