0

所以我們可以說,在你的應用程序,你必須處理的數據內容的安全性,以這樣的方式應用的幾個「實體」必須被固定,使得用戶無法查看,編輯等某些代碼範圍。假設我們已經獲得了位置,部門,部門,ProductLine等實體的安全性,並且每個用戶都與每個實體的一系列代碼關聯。你會在這種情況下去規範數據庫,以便所有授權用戶的代碼都存儲在用戶配置文件表中,而不是連接表嗎?例如,可以使用正則表達式來指定柵格,包括和排除等。我已經在數據倉庫應用程序中成功地使用了這種方法,但對於事務性系統,我不確定,因爲每個人都在這裏說,沒有它。但對我來說,看起來相當愚蠢的是必須加入所有這些表格,水合實體只是爲了獲得代碼列表,以便我可以做User.HasAccessTo<TEntity>(entityId)處理數據內容安全

回答

1

有我們使用,我的工作的另一種方法。

主政系統,如果你想複雜,所以我們的角色的概念,或配置文件。角色或配置文件指定用戶可以施加哪些操作以及哪些數據。

然後,我們有一個樹狀結構,爲用戶。一個用戶屬於一間辦公室,屬於一個部門,屬於一個部門等...

對於施用,每一個樹的元素可以關聯的任何個人資料(其中幾位如有必要)。

如果我們要保持這個然而由於是,這將導致查詢膨脹,因爲像你這樣的規定may user X modify Y ?一個簡單的問題,就需要收集所有資料,收集所有的角色屬性,每個配置文件,然後最後發展檢查操作是否被授權的角色。

爲了簡化查詢,該表的非規範化版本,因此週期性創建(比如每小時),和查詢是針對非規範化的版本(存儲在SQLite數據庫)上運行。

當然,這意味着你有一定的時間由管理員所做的修改生效(你必須等待,直到非規範化+複製)之前,但它工作得很好,因爲你有兩全其美的:

  • 管理員有一個歸一化圖
  • 查詢是超快

訣竅是具有適當的「複製」的機制。首先使用sqlite數據庫生成文件,然後將其複製到每臺機器上,將進入的事務(只讀)置於保持狀態,並等待事務沒有執行,然後將新數據庫移到舊數據庫的位置,並恢復待處理的交易。它工作得很好,但它意味着你不想每秒更新一次數據庫文件。

+0

非常有趣的使用SqlLite的,但我不認爲他們會去這裏。但是,嘿,我可以創建一個非標準化(報告)表,將這個整個配置文件信息收集在一張表中。 我們也有角色的概念,NetSqlAzman用於定義任務,操作和角色。用戶可以屬於任何角色,並且與數據內容分離。角色,操作和任務更多地用於用戶可以訪問的模塊,屏幕等,數據內容安全性將定義用戶可以訪問的信息。 – epitka 2009-10-26 14:47:23