我正在實現對類中的不同方法使用基於角色訪問的系統。例如,要執行任何操作,我需要檢查使用它的用戶是否可以執行此操作。基於角色的訪問方法
我可以在每種方法寫:
if(User.IsInRole ...) {
} else {
return ... throw ... whatever
}
我在想通過添加屬性此方法或也許任何其他溶液自動化這個過程例如?
我正在實現對類中的不同方法使用基於角色訪問的系統。例如,要執行任何操作,我需要檢查使用它的用戶是否可以執行此操作。基於角色的訪問方法
我可以在每種方法寫:
if(User.IsInRole ...) {
} else {
return ... throw ... whatever
}
我在想通過添加屬性此方法或也許任何其他溶液自動化這個過程例如?
看看'Aspect Oriented Programming'(AOP)庫 - 以及this StackOverflow question的答案。 您可以使用AOP自動添加角色檢查代碼。
只要你用校長的東西已經在那裏了......
[PrincipalPermission(SecurityAction.Demand, Role = "A role available on your principal")]
public void Foo()
{
// Will throw an exception if the principal does not have the required role
// Otherwise the method will execute normally
}
在構造時做檢查一次,並引發(或從工廠返回NULL)如果安全條件沒有得到滿足。此後,持有對給定模型對象的引用足以證明您在某個早期點通過了安全檢查。如果您擔心這可能導致TOCTTOU問題,請確保這些對象在應用程序定義的「遊戲開啓」概念(通常是數據庫事務)結束時變得不可用;無論如何,這是一個很好的做法。
這種安全方法稱爲capability discipline。將您的對象視爲具有some authority inside them(在其私有變量中)的框。通過按下框中的按鈕,您只能以對象的程序員允許的方式對該權限執行定製的部分。
例如,假設您正在編寫帶有SQL後端的日曆應用程序。有一個SQLTransaction
對象,它不會超過事務(如上所述),但它仍具有應用程序使用的所有表的所有權限。這是很多權力,你不想傳遞給你的API的用戶(明確或錯誤地認爲SQL注入)。相反,您可以發佈User
對象,這些對象將建模權限僅寫入Users表中的用戶行; User
也可以創建,讀取,更新,刪除Appointment
對象,這些對象類似地代表Appointments表中的有限權限。
爲了保持RBAC整個API,你必須確保下列條件成立:
User
對象表示他們。這是將驗證系統連接到User
構造函數的地方;User
對象不leak authority,即你必須審覈您的API,以確保在User
通過鍛鍊方法調用(或任何相關的對象他們返回,遞歸),您無法讀取或修改不屬於任何資源這個用戶。這是您可以應用facet模式的位置 - 例如,User.GetAppointments()
會爲該用戶創建的約會返回實際Appointment
實例,但會爲其他人創建的約會創建只讀包裝。