2009-06-03 39 views
11

推薦的方法是確定用戶是否有一定的權限(例如選擇或執行) PostgreSQL中的某些類(例如表或函數)?找出用戶是否有權在PostgreSQL中選擇/更新/ ...表格/函數/ ...

目前我有類似

aclcontains(
    someColumnWithAclitemArray, 
    makeaclitem(userOid,grantorOid,someRight,false)) 

但它是可怕的,因爲我要檢查每一個grantorOid這是可能的,併爲每個userOid用戶可以屬於。

在相關說明:您可以測試什麼樣的權利? 我還沒有發現任何文件,但閱讀源代碼,我想:

INSERT 
SELECT 
UPDATE 
DELETE 
TRUNCATE 
REFERENCES 
TRIGGER 
EXECUTE 
USAGE 
CREATE 
CONNECT 

看起來也似乎是一個CREATE TEMP正確的,但我不能找出正確的文本在makeaclitem -function使用。

回答

17

我發現一個更好的方法(我似乎記得這是從一些內置到psql中的查詢中獲取的,或者也許是information_schema視圖)是使用has_*_privilege函數,並將它們應用於一組全部用戶和對象的可能組合。這也將考慮到通過某個組角色訪問對象。

例如,這將顯示哪些用戶具有訪問非目錄表和視圖:

select usename, nspname || '.' || relname as relation, 
     case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type, 
     priv 
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace, 
    pg_user, 
    (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder) 
where relkind in ('r', 'v') 
     and has_table_privilege(pg_user.usesysid, pg_class.oid, priv) 
     and not (nspname ~ '^pg_' or nspname = 'information_schema') 
order by 2, 1, 3, privorder; 

可能的權限是在的has_*_privilege功能中的http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE的描述詳細說明。

'CREATE TEMP'是數據庫級特權:它允許用戶使用pg_temp_*模式。它可以用has_database_privilege(useroid, datoid, 'TEMP')進行測試。

相關問題