تعرف على ما إذا كان لدى المستخدم إذن لتحديد / تحديث / ... جدول / وظيفة / ... في Postgresql

StackOverflow https://stackoverflow.com/questions/946804

سؤال

ما هي الطريقة الموصى بها لمعرفة ما إذا كان المستخدم حصل على حق معين (مثل تحديد أو تنفيذ) في فئة معينة (مثل الجدول أو الوظيفة) في 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..

"إنشاء TEMP" هو امتياز على مستوى قاعدة البيانات: يسمح للمستخدم باستخدام أ pg_temp_* مخطط. يمكن اختبارها has_database_privilege(useroid, datoid, 'TEMP').

نصائح أخرى

نلقي نظرة على "وظائف استفسار الامتياز" وأيضا "منحة" الصفحه المرجعيه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top