2012-10-23 35 views
2

在使用Entity Framework 4.1的Web應用程序中,我們使用SQL Server Membership來管理用戶訪問。但是,我們需要實施更細化的角色集權限管理。使用Entity Framework管理實體訪問和權限

在數據庫中,我們已經創建了相對錶:

- Roles 
- Permissions 
- UserInRole (roles per user) 
- RolesPermissions (permissions associated to a role) 

一些我們限制語義與EF接入的核心實體的使用屬性,例如,給出一個特定的用戶,他/她可以請僅查看相關的裝運訂單或固有數據。

現在我們想注入的權限在裏面,這意味着作爲例子,一個客戶可以看到和創建訂單,而公司(這是兩個不同的角色)只能看到訂單爲他們的產品,也打印報告。

這個想法是使用屬性也用於實體級別的權限,並檢查當調用方法時當前用戶是否擁有適當的權限。例如:

public void BeforeAdd() 
{ 
    // Get required permissions for the specific entity (Order as example) 

    //Check that current user has permission of creating a new Order 
} 

這樣的方法將被每個實體調用,從而允許集中控制權限在實體級別。

我們使用MVC作爲前端,在那裏我們已經實現了角色和權限的訪問。我們需要對後端部分(包含數據層)進行相同的處理。這些是通過Web服務進行通信的兩臺獨立服務器通過在後端部分實施權限管理可以加強對數據訪問的控制。

是否有任何可以遵循的模式或最佳實踐(最終使用EF的某些內置功能)來實現權限管理?

+0

您使用[repositories](http://msdn.microsoft.com/en-us/library/ff649690.aspx)嗎? –

+0

是的,我們使用通過泛型允許按特定實體獲取存儲庫的存儲庫。 – Francesco

回答

3

有,我們可以遵循

是的,這就是所謂的Aspect-Oriented ProgrammingPostSharp可能是這個職位的最佳工具,任何模式或最佳實踐(可惜它不是免費的)。但是,如果你使用的是MVC(你還沒有提到任何東西),你可以派生自己的AuthorizeAttribute版本來查詢你自己的許可表,你可以簡單地用你想要的角色裝飾你的動作允許例如

[Authorize(Roles="Customer, Company")] 
public ActionResult ViewOrders(...) 
{ 
    ... 
} 

[Authorize(Roles="Customer")] 
public ActionResult CreateOrder(...) 
{ 
    ... 
} 
+0

我不知道AOP的深度,但我會閱讀它(提示+1)。 PostSharp對我們來說可能太多了,因爲我們已經實現了我們的日誌和審計系統。 – Francesco

+0

請參閱我的問題中的編輯。 – Francesco

+0

@Luca是啊我不是建議你使用PostSharp,只是指出它已經有一個框架可以用來開箱即用這種事情。儘管MVC,但AOP實際上可能相當微不足道。 – James

相關問題