2008-11-14 157 views
4

我最近纔開始使用MVC方法的工作,所以我想這是一個容易爲你在這裏大師:安全和訪問控制

我應該把訪問控制?

  1. 在某視圖中?我不想在模板中有開關和標誌以外的任何邏輯,所以聽起來像最不可行的選項
  2. 在模型中?每個業務對象是否應該根據誰的要求來決定它將公開哪些數據?
  3. 在控制器中?這就是我現在擁有的地方,但它使得難以保持業務規則的一致性

或者還有其他選擇嗎?

回答

4

這將取決於您使用的框架,並且該語言將決定您可以使用的許多工具。

從高層次來看,您應該在入口點處配置訪問安全性。你應該仔細檢查每個級別的訪問安全性,這些訪問安全性可以被認爲是自治的,或者從你的應用程序的多個部分重用(誰知道你的同事的門戶使用你的邏輯層檢查安全性等)。另一個需要擔心的就是數據安全性,它儘可能地接近你的數據(所以,對你的#2來說,是的,但是明白它是獨立的)。

這與我喜歡談論的應用程序邏輯和領域邏輯之間的差異類似。如果有任何特定於某個特定應用程序的邏輯(Web應用程序與Windows服務相比,或者其他),那麼應僅在該應用程序中定義該邏輯。如果某些邏輯跨越應用程序之間的邊界(可在應用程序之間重用),則它符合領域邏輯,應在您的模型中定義。您的應用程序可以使用域邏輯,但他們不應該擁有它。

0

對於模型(又名數據)安全性,模型將「控制」訪問,而控制器將「促進」訪問。這提供了獨立於控制器的模型重用,並且如果不否定使用該模型的不同控制器所需的通用代碼複製,則最小化。

例如汽車,駕駛員和鑰匙。 (分別爲型號,控制器,API)。憑藉非常小的接口(密鑰== API),該模型允許或拒絕每個API(密鑰卡)的控制器訪問。允許不同類型的訪問(代客鑰匙,所有者鑰匙,車主FOB)。使用代客鑰匙接口,控制器將無法訪問模型的一些數據/功能,如手套箱,行李箱和儲氣罐。這基本上是基於角色的訪問模式,通過識別和分類具有非常小的API /命令表面區域的Controller來實現。

這意味着該模型可以被其他控制器(具有不同驅動程序的汽車)只使用基本身份驗證來訪問模型(汽車的功能和車廂)的數據。