2013-02-09 65 views
2

這就是我一直在讀:PostgreSQL的SELECT規則,繼承,行級權限

http://www.postgresql.org/docs/9.2/static/rules-views.html 
http://www.postgresql.org/docs/9.2/static/rules-privileges.html 

我的目標是讓一個登錄只看到那些,它「擁有」,可以這麼說。

假設數據庫中的每個表,從該表繼承:

create table WHOAMI 
    ( 
     tenant varchar(25) not null default current_user 
    ); 

例如:

create table FOO 
    (
    id int primary key, 
    invoicedate date 
    ) inherits (WHOAMI); 

    insert into FOO(id, invoicedate) values(1,now()::date); 

    select * from FOO; 

    --abclogin|1|2013-02-01 

有PostgreSQL中這樣的事,作爲一個架構級的選擇規則,影響模式所有表和視圖,即追加到每一個選擇,插入,更新或刪除聲明說,在,..AND WHERE TENANT = current_user效果的條件?如果沒有這樣一個全球性的規則,是否可以一桌一桌地完成?我的嘗試沒有取得任何成功,並且可能誤解了有關創建規則的一些事情。以下是我試圖做:

我嘗試創建一個選擇規則:

CREATE RULE "_RETURN" AS ON SELECT TO FOO DO INSTEAD 
    SELECT * FROM FOO where tenant = current_user; 

,但得到這個錯誤:ERROR: could not convert table "foo" to a view because it has indexes

我試圖創建一個視圖安全 - 屏障

 CREATE VIEW TENANTFOO WITH (security_barrier) AS 
     SELECT * FROM FOO WHERE tenant=current_user; 

,然後嘗試插入:

 insert into TENANTFOO(id,invoicedate) 
     values(2,(now()::date); 

,但得到這個錯誤:

 `ERROR: cannot insert into view "tenantfoo" 
     HINT: You need an unconditional ON INSERT DO INSTEAD rule 
     or an INSTEAD OF INSERT trigger.` 

實現對錶的行級安全性障礙,需要哪些步驟?

回答

2

在你的最後一個例子,你需要運行INSERT對陣表或創建另一個規則:ON INSERT TO TENANTFOO DO INSTEAD

1

什麼你要找的是一個Row-Level Security,它是尚未公佈,但some work had been done on this thing。我希望這個補丁能夠使它進入即將發佈的9.3版本。

同時,我一直在與下面的設計前一陣子。

要求是相似的,觀點應該已經只交付用於在CURRENT_USER那些行。在我們的例子訪問已經做得相當簡單:指定給定用戶是否對給定關係的訪問和定鍵的表,水木清華這樣的:

CREATE TABLE user_grants (
    user_id  integer, 
    entity_name text, -- should exist in pg_class 
    entity_id integer 
); 

然後,說了tasks,下面的視圖已經建立:

CREATE VIEW tasks_v AS 
SELECT t.* 
    FROM tasks t 
    JOIN user_grants ug ON t.user_id = ug.user_id 
    AND ug.entity_name='TASKS' AND ug.entity_id = t.task_id; 

當然,如果沒有許多輔助函數,觸發器和規則,安裝程序是不完整的。還有必要確保總是授予一些合理的默認權限。