ユーザーが PostgreSQL でテーブル/関数/…を選択/更新/…する権限を持っているかどうかを確認する
-
09-09-2019 - |
質問
ユーザーが特定の権利を持っているかどうかを確認するための推奨される方法は何ですか(例:特定のクラス (例: 選択または実行) を実行します。テーブルまたは関数) PostgreSQL では?
現時点では次のようなものを受け取りました
aclcontains(
someColumnWithAclitemArray,
makeaclitem(userOid,grantorOid,someRight,false))
でも毎回チェックしなきゃいけないから大変だよ grantorOid
それは可能であり、あらゆる人にとって userOid
ユーザーは所属することができます。
関連したメモ:テストできる可能性のある権利は何ですか?ドキュメントは見つかりませんでしたが、ソースコードを読むと次のようになると思います。
INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT
もあるようです CREATE TEMP
そうですが、で使用する正しいテキストがわかりません makeaclitem
-関数。
解決
より良いアプローチ(これは 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')
.
他のヒント
「を見てみましょうアクセス権限照会関数「とも」GRANT」リファレンスページます。