ข้อผิดพลาด: การอนุญาตถูกปฏิเสธสำหรับความสัมพันธ์ tablename บน Postgres ขณะพยายาม SELECT เป็นผู้ใช้แบบอ่านอย่างเดียว


89
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

ผู้ใช้แบบอ่านอย่างเดียวสามารถเชื่อมต่อดูตาราง แต่เมื่อพยายามทำการเลือกง่ายๆจะได้รับ:

ERROR: permission denied for relation mytable
SQL state: 42501

สิ่งนี้เกิดขึ้นกับ PostgreSQL 9.1

ฉันทำอะไรผิด?


1
คุณสามารถให้รายละเอียดเกี่ยวกับ "ความสัมพันธ์ mytable" ได้หรือไม่ สคีมาเป็นตาราง "จริง" (หรือมุมมอง / ฟังก์ชัน) ทริกเกอร์ ...
Igor Romanchenko

คำตอบ:


162

นี่คือโซลูชันที่สมบูรณ์สำหรับ PostgreSQL 9+ ซึ่งอัปเดตล่าสุด

CREATE USER readonly  WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

-- repeat code below for each database:

GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

ขอบคุณhttps://jamie.curle.io/creating-a-read-only-user-in-postgres/สำหรับประเด็นสำคัญหลายประการ

หากใครพบรหัสที่สั้นกว่าและควรเป็นรหัสที่สามารถดำเนินการนี้กับฐานข้อมูลที่มีอยู่ทั้งหมดได้


6
นี่รวมถึงการดูไหม
Frank Conry

9
เหตุใดคุณจึงให้GRANT ALLสิทธิ์เป็นค่าเริ่มต้นแก่ผู้ใช้แบบอ่านอย่างเดียว
Slava Fomin II

1
ฉันให้ตรงตามที่กำหนดไว้ แต่ยังคงเป็นข้อผิดพลาด sam
Anish Gopinath

\ddpสิทธิสามารถยืนยันได้รับใช้ ควรแสดง=r/เหมือนgranting_user=r/readonly_userสำหรับการเข้าถึงแบบอ่านเท่านั้น
Greg Bray

นี่คือ SQL คำต่อคำจากคำถาม ฉันไม่เห็นวิธีแก้ปัญหา
r351574nc3

12

พยายามเพิ่ม

GRANT USAGE ON SCHEMA public to readonly;

คุณอาจไม่ทราบว่าจำเป็นต้องมีสิทธิ์ที่จำเป็นสำหรับสคีมาเพื่อที่จะใช้ออบเจ็กต์ในสคีมา


สิ่งที่แปลกที่เกิดขึ้นผมเรียกใช้คำสั่งเหล่านี้บนเซิร์ฟเวอร์โดยใช้psqlเป็นผู้ใช้และฉันจะได้รับการตอบสนองที่เหมาะสมpostgres GRANTแต่ถึงกระนั้นเมื่อฉันมองไปที่ ACL ในตารางที่ฉันเห็นเพียงสองบัญชีอื่น ๆ หนึ่งเป็นเจ้าของฐานข้อมูลjirauserและอื่น ๆ qauserอ่านได้อย่างเดียวบัญชีชื่อ แต่ของฉันreadonlyไม่ปรากฏที่นั่น Postgres เป็นเวอร์ชัน 9.1 และฉันได้รีสตาร์ทเซิร์ฟเวอร์ก็ยังไม่มีอะไรเกิดขึ้น
sorin

2
เอาต์พุตของ \ du ในคอนโซล psql คืออะไร คุณยังสามารถให้ผลลัพธ์นี้ได้หรือได้รับการแก้ไขแล้วเหมือนในคำตอบของคุณ?
sufleR

ฉันไม่รู้จริงๆว่าเกิดอะไรขึ้นเนื่องจากผลลัพธ์ถูกต้อง (GRANT) YEsterday มันใช้ไม่ได้ แต่วันนี้มันใช้งานได้หลังจากเรียกใช้อีกครั้งทั้ง 3 คำสั่ง
sorin

3
หมายเหตุ: การตอบสนองที่คาดหวังนี้เป็นเพียง 'GRANT' หากคุณเห็น "คำเตือน: ไม่มีการให้สิทธิ์" สาธารณะ "แสดงว่าไม่ทำงาน ผู้ใช้แบบอ่านอย่างเดียวไม่สามารถให้สิทธิ์พิเศษแก่ตนเองได้ เฉพาะผู้ใช้ที่มีสิทธิ์ "GRANT" เท่านั้นที่สามารถทำได้ดังนั้นคุณอาจต้องเข้าสู่ระบบในฐานะ superuser
PeterVermont

สวัสดีเมื่อฉันพยายามให้การเลือกบนตารางทั้งหมดในโครงการสาธารณะเพื่อโพสต์ มันตอบสนอง: ข้อผิดพลาด: การอนุญาตถูกปฏิเสธสำหรับฐานข้อมูลความสัมพันธ์echangeloglock คุณรู้ไหมว่าฉันทำอะไรผิด? ขอบคุณ (มันเกิดขึ้นบน GAppEngine Posgres9.6 โดยใช้ที่อยู่สาธารณะและเข้าถึงผ่านเทอร์มินัล)
Mike

-5

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

ตรวจสอบบทบาทปัจจุบันที่คุณลงชื่อเข้าใช้โดยใช้: SELECT CURRENT_USER, SESSION_USER;

หมายเหตุ : ต้องตรงกับเจ้าของสคีมา

Schema | ชื่อ | พิมพ์ | เจ้าของ
-------- + -------- + ------- + ----------

หากเจ้าของแตกต่างกันให้มอบสิทธิ์ทั้งหมดให้กับบทบาทผู้ใช้ปัจจุบันจากบทบาทผู้ดูแลระบบโดย:

GRANT 'ROLE_OWNER' เป็น 'CURRENT ROLENAME';

จากนั้นลองดำเนินการค้นหามันจะให้ผลลัพธ์เมื่อเข้าถึงความสัมพันธ์ทั้งหมดได้แล้ว


5
การเปลี่ยนเจ้าของเป็นผู้ใช้ที่เรียกว่าอ่านอย่างเดียวแทบจะไม่เหมือนการแก้ไขที่ถูกต้อง
Anna

เจ้าของโต๊ะที่ไม่ถูกต้องอาจเป็นสาเหตุได้ทั้งนี้ขึ้นอยู่กับกรณีของคุณ (เป็นศัตรูกับฉัน) วิธีที่เหมาะสมในการเปลี่ยนเจ้าของตารางใน PostgreSQL: ดูstackoverflow.com/a/13535184
tanius

-6

ตรวจสอบให้แน่ใจว่าผู้ใช้ของคุณมีคุณสมบัติตามบทบาท ตัวอย่างเช่น:

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

หลังจากดำเนินการคำสั่งต่อไปนี้:

postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      | Superuser                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}

มันแก้ไขปัญหา

ดูบทแนะนำสำหรับบทบาทและสิ่งต่างๆที่นี่: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2


18
ไม่! การให้บทบาท Superuser แก่ผู้ใช้ที่เรียกว่า "อ่านอย่างเดียว" เพื่อทำ "เลือก" ไม่ใช่วิธีแก้ไขที่ถูกต้อง
Anna

@ แอนนานั่นไม่ใช่สิ่งที่เกิดขึ้นที่นี่ หัวข้อนี้ไม่ได้เกี่ยวกับการให้สิทธิ์เข้าถึงแบบอ่านอย่างเดียว เธรดนี้เกี่ยวกับการให้สิทธิ์ผู้ใช้เพื่อให้ผู้ใช้รายอื่นเข้าถึงแบบอ่านอย่างเดียว IMHO นี่ถูกต้อง หากผู้ใช้ของคุณไม่ใช่ Superuser คุณจะไม่สามารถสร้างผู้ใช้แบบอ่านอย่างเดียวได้ เกิดข้อผิดพลาดจากความสามารถในการสร้างผู้ใช้แบบอ่านอย่างเดียวERROR: permission denied for relation mytable
r351574nc3

-7

คุณควรดำเนินการค้นหาถัดไป:

GRANT ALL ON TABLE mytable TO myuser;

หรือหากข้อผิดพลาดของคุณอยู่ในมุมมองตารางอาจไม่มีสิทธิ์ดังนั้นคุณควรดำเนินการค้นหาถัดไป:

GRANT ALL ON TABLE tbm_grupo TO myuser;

5
ผู้ใช้เรียกว่า "อ่านอย่างเดียว" เป็นที่น่าสงสัยว่าการให้สิทธิ์ทั้งหมดแก่ผู้ใช้คือเป้าหมาย เขาแค่ต้องการเลือก
Anna

สิ่งนี้จะเอาชนะวัตถุประสงค์ของการตั้งชื่อผู้ใช้ 'ReadOnly' หากคุณให้ALTER DROP DELETEEct ถึงผู้ใช้นั้น ...
JayRizzo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.