2013-11-25 78 views
1

我試圖找到實現基於用戶的數據訪問的最佳方式。例如,假設我們有一個公司有一位首席執行官和不同的部門負責人。數據庫包含每個部門的財務數據,CEO可以查看所有部門的財務數據,而每個部門主管只能查看與其部門相關的數據。基於用戶的數據訪問

我使用的數據庫是PostgreSQL,它尚未實現行級訪問規則。

我想知道是否有一個已知的範例可以用來實現這一點。我看了看RBAC,但這似乎太複雜了,無法滿足我的需求。

任何建議/評論?

Elie

+0

可能更適合dba.SE. –

回答

1

Imo,訪問控制在應用程序級實現起來要方便得多。

儘管數據庫級別(甚至包含行級別)的訪問控制權限不會允許您輕鬆管理棘手的用例,例如:「允許經理的祕書僞裝成此子任務的管理者而他下個月需要休息一週。「堅持使用它來防止應用程序的數據庫用戶破壞數據。

在應用程序級別,請在RBAC和ACL中稍微深入一點。周圍有一些很好的實現,完整的模式。例如:

http://symfony.com/doc/current/cookbook/security/acl.html

無論接近你挑,我認爲關鍵是要擁有它,這樣你可以在那裏使用觀察者模式(事件,過濾器,插件掛鉤的一些變化塞應用程序邏輯,無論它在你最喜歡的框架中被調用)。這將允許您使用回調來管理棘手的案例,而不是模式的怪異。

一些(豐富多彩的和有爭議的)發言者把它更進了一步:http://vimeo.com/2723800

0

這是一個複雜的話題。我並不是不加批判地支持Denis對基於應用程序的訪問控制的建議,因爲雖然它經常是合適的地方,但並非總是如此。一旦您使用基於應用程序的解決方案,您就會遇到應用程序的所有請求。問題是這是否是您想要做出的折衷,或者您是否希望在通過其他方式時保留規則。

PostgreSQL沒有簡單的基於行的訪問控制,但是如果需要的話,有足夠的工具可以完成某些工作。這並不簡單,但它具有與應用程序無關的優點。一個完整的解決方案是超越了任何一個職位的範圍,但這裏有浮現在腦海中的潛在片:

  1. 安全屏障的意見(您可以使用觸發器來管理更新)
  2. pg_has_role()

現在,與Denis的上述答案有何共同之處在於,您不僅僅是在表格上實現這一點,而是在數據處理層中實現這一點。問題是該層放置在數據庫連接的哪一側,僅此而已。那裏的需求取決於你想要執行所有訪問的問題。