2012-02-12 74 views
7

我有3個角色:超級用戶,超級用戶和用戶。我有表「數據」和函數data_select和data_insert。postgresql 9.1 - 通過函數訪問表

現在我想定義,只有超級用戶可以訪問表「數據」。 Poweruser和用戶不能直接訪問表格「數據」,而只能通過功能。

用戶只能運行功能data_select,高級用戶可以同時運行data_select和data_insert。

於是我可以創建用戶愛麗絲,鮑勃,......並繼承他們的用戶或poweuser權限。

這實際上可以實現嗎?我在第二天爲此而戰,沒有到任何地方。

謝謝你的時間。

回答

8

是的,這是可行的。

「超級用戶」 可能是一個實際的superuserpostgres默認。 我將普通用戶的角色重命名爲usr,因爲user是保留字 - 不要將其用作標識符。

CREATE ROLE usr; 
CREATE ROLE poweruser; 
GRANT usr TO poweruser; -- poweruser can do everything usr can. 

CREATE ROLE bob PASSWORD <password>; 
GRANT poweruser TO bob; 

CREATE ROLE alice PASSWORD <password>; 
GRANT usr TO alice; 

REVOKE ALL ON SCHEMA x FROM public; 
GRANT USAGE ON SCHEMA x TO usr; 

REVOKE ALL ON TABLE x FROM public; 
REVOKE ALL ON TABLE y FROM public; 

CREATE FUNCTION 
    ... 
SECURITY DEFINER; 

REVOKE ALL ON FUNCTION ... FROM public; 
GRANT EXECUTE ON FUNCTION a TO usr; 
GRANT EXECUTE ON FUNCTION b TO poweruser; 

或者你可以不登錄自己的功能,並保持在桌子上各自的權利創建角色守護進程。這會更安全。

如果你要這條路線,你會ALTER DEFAULT PRIVILEGES(引入PostgreSQL 9.0)。 More details in this related answer

閱讀手冊中的一章Writing SECURITY DEFINER Functions Safely