2013-07-10 48 views
0

在我的應用程序中,請求者有權僅查詢某些列。請求者之間的列可能有所不同。 where子句在請求之間改變,以便返回的行隨着每個查詢而改變。處理這種訪問控制的最佳方式是什麼?我應該使用數組來存儲允許的列,然後在我的應用程序中執行檢查嗎?如何根據請求者的id限制SQL列?

我對PostgreSQL的9.x中

例子: 我們有可以訪問的病人記錄,但不是所有的醫學專業人士應該能夠訪問所有信息專業醫務人員。他們試圖請求關於任何患者(有一個uid)的任意信息,但我們應該強制執行訪問控制。

所以說,信息是姓名,出生日期,血型和疾病的日期

醫生A對所有領域 醫生B可看到,除了血型一切 管理員只能看到出生 的名字和日期的權限血液科醫生只能看到血型

回答

1

要實施選項2,我想有一個列權限表類似如下:

CREATE TABLE ColumnPerms 
(
    user_or_role  Varchar(50), 
    table_name  Varchar(50), 
    column_name  Varchar(50), 
) 

CREATE INDEX ix_Columnperms(user_or_role, table_name) 

的* table_name的*列,以允許實現此功能不止在一張桌子上你的應用程序:如果沒有必要,請不要使用它。您可以採用約定,即角色名稱以'@'字符開始,以確保與用戶名稱沒有衝突。

現在,當你建立你的動態查詢,你可以這樣做

​​

(IN子句應該包括每列可能要返回)。

此查詢的結果是允許用戶查看的列名稱的列表。在構建動態SQL時,只需遍歷它即可構建列列表。

0

有兩種方法,你可以採取:

  1. 使用Postgres的使用列級p來執行安全每個用戶(或用戶角色)的權限。請看GRANT的語法:http://www.postgresql.org/docs/current/static/sql-grant.html

  2. 構建動態SQL語句,限制每個用戶可能返回的行。如果有許多用戶或許多不同的列組合,這可能會變得非常繁瑣。您可能需要保留一個用戶標識表,以及用於構建查詢語句的「可選」表,列名。如果你想這個推廣到許多不同的查詢,您既可以建立他們對不列過濾表,恢復功能的頂部,或恢復選項1.

對於第一種情況,確保列在連接使用的是可選的...

+0

GRANT似乎面向DB「用戶」,而我的「用戶」是應用程序的用戶。具體來說,當我打開與db的連接時,我的應用程序的當前用戶將被修復,我認爲創建許多短暫連接並不是一個好主意。 – user492922

+0

然後,將選項減少到數字2。 – Curt

+0

至於你的第二個選擇,「可選」表的模式是什麼?每行是否包含每列的布爾值?我可以在應用程序方面開展工作。我最初的建議是使用數組來存儲列並在應用程序中進行檢查嗎? – user492922