2013-01-31 59 views
0

大型系統正在被許多用戶使用,因此他們可以登錄系統,然後他們擁有額外的權限。權限不同,例如查看有關其他用戶的詳細信息的權限或執行不同操作的權限。軟件開發的良好做法是使用設計模式。其中之一是MVC(模型 - 視圖 - 控制器)。所以,我的問題是:模型的哪一層應該檢查權限?該應用程序邏輯應該驗證用戶權限,或者在視圖層中,一些選項應該隱藏/鎖定/等?MVC設計模式中的用戶權限

+0

在Software Engineering SE中查看此問題:https://softwareengineering.stackexchange.com/questions/220574/where-should-user-permission-checks-take-place-in-and-mvc-and-by-who – Flimm

回答

4

身份驗證和授權不是MVC設計模式本身的一部分。它也不是任何基本的MVC構建塊的直接責任。

您可以探索的解決方案是將訪問控制放置在裝飾器中。

您創建了一個Container實例,您可以在其中注入一個對象(它可能是某個控制器,視圖或模型層的服務)以及某個授權管理器。然後你調用這個容器上的方法,就好像它是原始對象一樣。如果通過訪問管理器清除呼叫,則執行該方法。否則,你會引發異常。

不幸的代碼示例是在PHP中,因爲這是我的 「原生」 的語言

$something = new SomeThing; 
$data = $something->getSensitiveData(); // will simply return all the information 

$accessCheck = new AccessManager(.. some dependencies ..); 
$something = new Container($something, $accessCheck); 
try 
{ 
    $data = $something->getSesitiveData(); 
    // will return all information if you pass the authorization. 
} 
catch (AccessDeniedException $e) 
{ 
    // do something 
} 

這種方法有幾個好處:

  1. 在訪問管理是集中
  2. 你可以在這樣的容器中注入任何實例
  3. 不會造成OCP違反
  4. 讓你推遲除了授權的同時開發

在這樣的裝飾的「包裝」將在工廠,創建您的實例中,通常會發生的。

至於哪個部分的MVC黑社會你應該包裝。那麼......通常這足以包裝控制器(特別是在Web上使用MVC時)。但是,根據您構建代碼庫的其餘部分的方式,對於服務(模型層中的一組類/實例)添加這種授權檢查可能也是合理的。

問題是,這種方法對粒度沒有限制。您可以在任何對象上添加這種類型的訪問控制。即使您沒有訪問該對象的源代碼。