1

任何人都可以幫忙嗎?實體框架:權限,用戶等的關係模型幫助

我期待創建一個良好的管理權限的關係模型。

我目前有一個用戶表和其他各種表,如客戶,供應商。

用戶需要在客戶,供應商中查看,編輯或創建權限。

我將使用EF這些表來決定哪些訪問權限的用戶和天氣顯示窗體或沒有等

我原來的模式是這樣的,但我認爲它錯了,因爲它不到風度聲明有關權限的任何信息。

用戶 UsersCustomers(包括用戶和客戶之間的關係) UsersSuppliers(包括用戶和供應商之間的關係) 客戶(customer表) 供應商(供應商表)。

雖然這有效,即它將用戶與客戶聯繫起來,例如......這看起來不對。

我正在考慮放置一個稱爲Permissions的中間表,它有一個Id和一個UserId來鏈接用戶表。然後,我可以將權限鏈接到表格,如

PermissionsCustomers(代替UsersCustomers),其中包含persistence和客戶之間的關係。

我覺得這個我並沒有得到最佳的設計。一旦這種設計是正確的,它也將缺少一個表來分配用戶對客戶的許可類型,即編輯,創建或僅查看等。

我很想聽聽一些反饋或強壯的例子存在這種功能的模型。

至於客戶,供應商,這些都只是2個例子,會有很多更喜歡deliveryLocation,accountsLedger等表

這將是巨大的,如果我可以做一個查詢,說:「給我所有用戶X擁有的權限「,目前在我的設置中,我將不得不分別查詢每個中間表。

我會通過一個像實體框架的ORM來使用它。

與關係模型的結構有點迷失。

在此先感謝。

+0

您是否真的要維護每個客戶和每個供應商的權限?換句話說,如果用戶擁有300個客戶和100個供應商的權限,那麼權限表中是否會有400行?這似乎是非常難以設置和維護。是不是有其他的方式(即這個用戶可以編輯俄亥俄州的所有客戶,或銷售額> 100萬美元等的客戶)。 –

+0

HI Ej,是的非常真實,但系統將包含只有15個客戶(其定製系統)和5個供應商..不會有那麼多..我需要真正有權給予用戶可以用客戶/供應商做某件事情。 – Martin

回答

2

鑑於您的客戶和供應商數量非常少(共20個),因此您不需要非常複雜的系統。

我在類似情況下所做的是有這樣一個結構的權限表設置:

  • 用戶ID(用戶ID)
  • 角色ID(鏈接到一個角色表中的ID,用諸如「編輯客戶」,「刪除供應商」等,查看客戶 等)
  • 的ObjectId(這將是標識無論要保護 對象的ID,因此無論是供應商ID或用戶ID)

角色表將有:

  • 標識(唯一的ID涉及角色ID的權限表)
  • 名稱(角色的唯一名稱,即「編輯客戶」)

然後,每個用戶實體都鏈接到一個權限表,每個用戶都有多個權限。當用戶登錄時,我通常會選擇將其所有權限加載到內存列表中,以便用戶擁有權限列表。權限列表將剛纔的的ObjectId和角色名和/或角色ID(我傾向於使用角色名,以使代碼更易於閱讀,你可以在下面的例子看到)

protected bool HasPermission(long ObjectId, string RoleName) 
{ 

//Users in the Administrator role have access to everything in the system. 
if (this.IsAdministrator) { 
    HasPermission = true; 
    return; 
} 

foreach (Permission P in Permissions) { 
    if (P.ObjectID == ObjectID & P.RoleName == Role) { 
     HasPermission = true; 
     return; 
    } 
} 
return false; 

} 

然後,如果我想要知道,如果一個用戶的權限東西,我會做到這一點:

if (myUser.HasPermission(CustomerId, "Edit Customer") { 
    //allow the user to edit the customer 
else 
    //allow the user to only view the customer (for example) 

if (myUser.HasPermission(SupplierId, "Print Supplier") { 
    //allow the user to print the record 
else 
    //give user a warning 

的關鍵是,每個「角色」需要是唯一的,你不能有一個通用的'編輯'角色,因爲如果你有一個具有相同ID的客戶和供應商,並且您想要查看該用戶是否具有「編輯」權限,則可能會得到錯誤的結果。所以有一個叫'編輯客戶'的角色和另一個叫'編輯供應商'的角色。

該解決方案不能很好地擴展imo,但對於只有數十個需要保護的記錄的數據庫來說,它工作得很好,並且易於實現和維護。它也沒有以真正的關係方式進行設置,即權限表中的ObjectId與供應商或客戶表無關。 (此外,在這種情況下,我的用戶對象知道它是否是管理員,管理員不需要權限設置,可以訪問所有內容,因此不需要權限搜索 - 可以節省幾納秒的時間)

+0

「這個解決方案不能很好地擴展」:你有一個類似的模型可以很好地擴展嗎?也許擁有項目組的權限或比其他角色更大的角色? – sports