2009-08-23 16 views
0

我正在寫一個depsktop應用程序(用Java)與一個主要存儲需求文檔的數據庫進行交互,但我有點困惑。具體來說,管理用戶訪問存在問題。編寫使用數據庫的桌面應用程序。如何管理用戶訪問表的建議?

爲了說明,我存儲上的文件夾結構中的所有細節在一個表中。但是,我想建立一個類似於Linux/Unix系統的用戶組機制,您只能添加/修改/刪除您有權訪問的文件夾。當然,我只能將數據庫權限分配給一個或多個表格,而不是代表他們有權訪問的文件夾的單個行。

解決這個問題的一個辦法是給每個文件夾自己的表格,然後只給予某些用戶更新/插入/刪除權限,但這只是一個噩夢,因爲#表會爆炸到難以控制的水平。

第二個選項是創建一個位於數據庫和客戶端之間的服務器端進程,它將返回用戶聲明的文件夾列表(刪除整個桌面特權問題,購買需要現在我寫一個網絡協議來談談這個過程,而不是直接使用jdbc驅動程序)

最終選項是觸發器,儘管我必須支持(mysql)的數據庫並不便於我拒絕。考慮到訪問頻率,我也希望避免由於增加的計算和較慢的性能而導致的觸發器。

都不是理想的,但我跑出來的想法。

建議?

回答

1

這個應用程序需要有多安全?

如果您只是試圖保護天真的用戶不小心將對方的文件夾搞砸了,並且您確實希望您的客戶端程序能夠直接訪問數據庫,那聽起來您需要處理桌面客戶端本身的文件夾權限。是的,這意味着一個聰明的「黑客」可以在反編譯你的Java代碼並發現數據庫的連接信息後直接連接到數據庫,但對於許多小型的企業內部網應用程序來說沒問題。

對於預計會增大,或需要真正細粒度安全的任何應用程序,它可能是值得實行DB和桌面客戶端之間的某種類型的服務器的工作量。

1

你不應該混爲一談DB的權利和權限與用戶權限。用戶代碼應該通過實現訪問限制功能的DAL或服務層。存儲有關權利的信息主要取決於您的身份驗證機制。如果您有現有的用戶認證系統(如活動目錄或LDAP),則可以將認證&授權集成到該認證中,或僅集成一個認證,並將授權推送到數據庫中。

基本上是你的模型,它聽起來就像你應該有一個表驗證過的實體,表用戶和組的兩個都具有一個FK進去,然後有一個FK關係到身份驗證實體表中的權限表。

0

你爲什麼不自己管理自己instaed依靠RDBMS做到這一點的應用程序中訪問?您可以創建一個用戶表與訪問級別表,並在訪問之前查閱它。

3

在PostgreSQL,這是你的兩難一個相當普遍的做法。雖然我沒有在MySQL中嘗試過它,但可能值得考慮。

也就是說,最好在你的應用程序而不是MySQL中管理它。請繼續閱讀。


您可以使用permission tablesviews混合物,和user()功能。

例如,假設你有一個表叫Document

Document_ID | Name | Content 
------------+------+-------- 
1234  | Doc1 | Bla bla 
2345  | Doc2 | Bla bla 
3456  | Doc3 | Bla bla 
------------+------+-------- 

而且你有一個權限表稱爲Document_User

Document_ID | User 
------------+------+-------- 
1234  | [email protected]'%' 
2345  | [email protected]'%' 
3456  | [email protected]'%' 
1234  | [email protected]'%' 
2345  | [email protected]'%' 
1234  | [email protected]'%' 
------------+------+-------- 

從上面的結構,很明顯,User Smith訪問所有三個文件,User Jones先後獲得了前兩個,和User White只能訪問第一個。

最後,創建這樣一個觀點:

CREATE VIEW 
SQL SECURITY DEFINER 
    `User_Document` 
AS 
    SELECT * 
    FROM `Document` 
    WHERE Document_ID IN 
     (SELECT Document_ID FROM Document_User WHERE User = USER()) 

當前登錄的用戶將看到一組在User_Document表只有他們有權查看這些記錄的記錄。

相關問題