2011-02-28 71 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

相關問題