ฉันกำลังพยายามสร้างผู้ใช้ DB แบบ จำกัด สำหรับแอปที่ฉันกำลังทำงานอยู่และฉันต้องการปล่อยผู้ใช้ฐานข้อมูล Postgres ที่ฉันใช้ในการทดลอง มีวิธีใดบ้างที่จะทิ้งผู้ใช้โดยไม่ต้องเพิกถอนสิทธิ์ทั้งหมดด้วยตนเองก่อนหรือเพิกถอนสิทธิ์ทั้งหมดที่ผู้ใช้มี
ฉันกำลังพยายามสร้างผู้ใช้ DB แบบ จำกัด สำหรับแอปที่ฉันกำลังทำงานอยู่และฉันต้องการปล่อยผู้ใช้ฐานข้อมูล Postgres ที่ฉันใช้ในการทดลอง มีวิธีใดบ้างที่จะทิ้งผู้ใช้โดยไม่ต้องเพิกถอนสิทธิ์ทั้งหมดด้วยตนเองก่อนหรือเพิกถอนสิทธิ์ทั้งหมดที่ผู้ใช้มี
คำตอบ:
เกี่ยวกับ
DROP USER <username>
DROP ROLE
นี้เป็นจริงนามแฝงสำหรับ
คุณต้องยกเลิกสิทธิ์ที่เกี่ยวข้องกับผู้ใช้นั้นอย่างชัดเจนรวมทั้งย้ายความเป็นเจ้าของไปยังบทบาทอื่น ๆ (หรือวางออบเจ็กต์)
สิ่งนี้ทำได้ดีที่สุดโดย
REASSIGN OWNED BY <olduser> TO <newuser>
และ
DROP OWNED BY <olduser>
ส่วนหลังจะลบสิทธิ์ที่มอบให้กับผู้ใช้
ดูเอกสาร postgres สำหรับDROP ROLEและคำอธิบายโดยละเอียดของสิ่งนี้
ส่วนที่เพิ่มเข้าไป:
เห็นได้ชัดว่าการพยายามทิ้งผู้ใช้โดยใช้คำสั่งที่กล่าวถึงที่นี่จะใช้ได้ผลก็ต่อเมื่อคุณดำเนินการในขณะที่เชื่อมต่อกับฐานข้อมูลเดียวกับที่ GRANTS เดิมสร้างขึ้นตามที่กล่าวไว้ที่นี่:
คำตอบที่ยอมรับส่งผลให้เกิดข้อผิดพลาดสำหรับฉันเมื่อพยายามลงชื่อใหม่เป็นของตัวเองหรือปล่อยให้เป็นของตัวเอง สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน:
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;
ผู้ใช้อาจมีสิทธิ์ในสคีมาอื่นซึ่งในกรณีนี้คุณจะต้องเรียกใช้บรรทัด REVOKE ที่เหมาะสมโดยแทนที่ "สาธารณะ" ด้วยสคีมาที่ถูกต้อง เพื่อแสดงสคีมาและประเภทสิทธิ์ทั้งหมดสำหรับผู้ใช้ฉันแก้ไขคำสั่ง \ dp เพื่อสร้างแบบสอบถามนี้:
SELECT
n.nspname as "Schema",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'S' THEN 'sequence'
WHEN 'f' THEN 'foreign table'
END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';
ฉันไม่แน่ใจว่าสิทธิพิเศษประเภทใดที่สอดคล้องกับการเพิกถอนตารางลำดับหรือฟังก์ชัน แต่ฉันคิดว่าสิทธิ์ทั้งหมดอยู่ภายใต้หนึ่งในสาม
REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
revoke USAGE on SCHEMA some_schema from username;
โปรดทราบว่าหากคุณได้รับอนุญาตอย่างชัดเจน:
CONNECT ON DATABASE xxx TO GROUP
,
คุณจะต้องเพิกถอนสิ่งนี้แยกจาก DROP OWNED BY โดยใช้:
REVOKE CONNECT ON DATABASE xxx FROM GROUP
ฉันต้องเพิ่มอีกหนึ่งบรรทัดเพื่อเพิกถอน ...
หลังจากทำงาน:
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
ฉันยังคงได้รับข้อผิดพลาด: ไม่สามารถทิ้งชื่อผู้ใช้ได้เนื่องจากวัตถุบางอย่างขึ้นอยู่กับมัน DETAIL: สิทธิ์สำหรับสคีมาสาธารณะ
ฉันพลาดสิ่งนี้:
REVOKE USAGE ON SCHEMA public FROM username;
จากนั้นฉันก็สามารถดร็อปบทบาท
DROP USER username;
นี่คือสิ่งที่ใช้ได้ผลสำหรับฉันในที่สุด:
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;
ไม่มีREVOKE ALL PRIVILEGES ON ALL VIEWS
ดังนั้นฉันจึงจบลงด้วย:
do $$
DECLARE r record;
begin
for r in select * from pg_views where schemaname = 'myschem'
loop
execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
end loop;
end $$;
และปกติ:
REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";
เพื่อให้สิ่งต่อไปนี้ประสบความสำเร็จ:
drop role "XUSER";
ในบรรทัดคำสั่งdropuser
มีคำสั่งที่พร้อมใช้งานเพื่อให้ผู้ใช้ออกจาก postgres
$ dropuser someuser
ฉันประสบปัญหาเดียวกันและตอนนี้พบวิธีแก้ไขแล้ว ก่อนอื่นคุณต้องลบฐานข้อมูลของผู้ใช้ที่คุณต้องการทิ้ง จากนั้นผู้ใช้สามารถลบได้อย่างง่ายดาย
ฉันสร้างผู้ใช้ชื่อ "msf" และพยายามอยู่ครู่หนึ่งเพื่อลบผู้ใช้และสร้างใหม่ ฉันทำตามขั้นตอนด้านล่างและประสบความสำเร็จ
1) วางฐานข้อมูล
dropdb msf
2) ปล่อยผู้ใช้
dropuser msf
ตอนนี้ฉันปล่อยผู้ใช้สำเร็จแล้ว
CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser
ให้ข้อความแสดงข้อผิดพลาด:ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo
. อย่างไรก็ตามDROP OWNED BY testuser
เคล็ดลับนั้นเห็นได้ชัดว่า Postgres ถือว่าเงินช่วยเหลือเป็นวัตถุที่หยดน้ำได้