2011-02-23 73 views
1

我早些時候詢問了question,但它可能過於模糊或過於寬泛以保證答案。自從我重新考慮了我的方法和我的問題。MVC框架,API層和身份驗證/權限

我正在考慮一個特定應用程序的框架,但顯然是保持重用性在最前沿。這個框架的關鍵元素是暴露一個API層,用於JSON驅動的遠程交互。

我在規劃這個問題的問題來自身份驗證/權限如果我在設計時考慮了MVC風格的體系結構,但想要允許通過API層使用,應在哪裏進行身份驗證/權限檢查?

Web訪問層本質上與API層相同,唯一的區別是輸出方法(HTML與JSON),所以我認爲這兩個公共業務邏輯層是合理的。請求將被標準化爲數據結構,併發送到業務邏輯。業務邏輯最終會踢出一個結果數據結構(查詢結果,失敗,成功等),這些數據結構要麼被送到模板引擎,要麼串行化到JSON。

在我看來,權限檢查需要在通用業務邏輯層中執行,但是有沒有更好的地方可以將它結合到MVC/API框架中?

我不知道現在還有什麼需要詳細說明的,所以請隨時索取更多詳細信息,我會在我提出這些細節時提供。

回答

2

你打算如何讓用戶訪問API?

這裏是我如何做到基於角色的授權:

  • 每個控制器通常有多個操作(方法)可以訪問的前端,例如
    • function action_get($id)
    • function action_delete($id)
  • 每個控制器都具有類屬性,用於指定所需的每一個動作,例如哪些角色
    protected $access = array(
        'get' => NULL, // everybody can access; this line isnt necessary though 
        'delete' => array('admin') // only admins can access 
    )
  • A before()方法在執行操作之前觸發。它根據$訪問列表進行授權檢查。
  • 每個動作負責確定要輸出的內容,例如,
public function action_get($id) { 
     // Business logic... build data structure 
     # ... 

     if (Request::is_ajax()) { 
      // Output JSON 
     } 
     else { 
      // Output HTML 
     } 
    }

該系統可以很容易地擴展到允許API調用。可以在方法的輸出部分展開,檢測它的API請求,或者簡單地爲API調用創建另一個操作。如果選擇後一種方法並希望保持DRY代碼,則將數據結構的業務邏輯移至輔助方法(例如protected function _get())。提供訪問和處理API的方法可能有更好的方法。這取決於你想如何允許訪問以及你想要如何實現靈活/乾燥。

+0

謝謝** simshaun **;這似乎是一個合適的解您建議的基於角色的權限似乎符合我的情況。我可以從Controller中移除輸出格式責任,因爲生成的數據結構對於模板插入或JSON序列化都應該格式良好。 API層的原因是應用程序和關聯的站點都可以獲取,修改或同步數據。我不願意接受,因爲我很快就會在我的問題中詳細解釋其他幾點。 – Dan 2011-02-23 23:39:42

1

通常,身份驗證是在控制器級別執行的(通常在控制器類的構造函數中,因此需要在該控制器中調用每個方法)。您當然會在模型中擁有一些用戶/角色數據,但是控制器會將請求與權限等進行比較,並允許或不允許該方法(然後該方法將決定輸出html,json,管他呢)。

+0

控制器級別是業務級別。 – RobertPitt 2011-02-23 23:02:06

+0

感謝您的快速反應** Jordan Lev **;我明白你在那裏說什麼了。我認爲在理解如何實現這一點方面存在的問題是,我在幾個層面上偏離了MVC概念,我沒有詳細說明。嗯,我會詳細闡述一下白板。 – Dan 2011-02-23 23:06:52