PostgreSQL - วิธีลดผู้ใช้อย่างรวดเร็วด้วยสิทธิ์ที่มีอยู่


122

ฉันกำลังพยายามสร้างผู้ใช้ DB แบบ จำกัด สำหรับแอปที่ฉันกำลังทำงานอยู่และฉันต้องการปล่อยผู้ใช้ฐานข้อมูล Postgres ที่ฉันใช้ในการทดลอง มีวิธีใดบ้างที่จะทิ้งผู้ใช้โดยไม่ต้องเพิกถอนสิทธิ์ทั้งหมดด้วยตนเองก่อนหรือเพิกถอนสิทธิ์ทั้งหมดที่ผู้ใช้มี

คำตอบ:


145

เกี่ยวกับ

DROP USER <username>

DROP ROLEนี้เป็นจริงนามแฝงสำหรับ

คุณต้องยกเลิกสิทธิ์ที่เกี่ยวข้องกับผู้ใช้นั้นอย่างชัดเจนรวมทั้งย้ายความเป็นเจ้าของไปยังบทบาทอื่น ๆ (หรือวางออบเจ็กต์)

สิ่งนี้ทำได้ดีที่สุดโดย

REASSIGN OWNED BY <olduser> TO <newuser>

และ

DROP OWNED BY <olduser>

ส่วนหลังจะลบสิทธิ์ที่มอบให้กับผู้ใช้

ดูเอกสาร postgres สำหรับDROP ROLEและคำอธิบายโดยละเอียดของสิ่งนี้


ส่วนที่เพิ่มเข้าไป:

เห็นได้ชัดว่าการพยายามทิ้งผู้ใช้โดยใช้คำสั่งที่กล่าวถึงที่นี่จะใช้ได้ผลก็ต่อเมื่อคุณดำเนินการในขณะที่เชื่อมต่อกับฐานข้อมูลเดียวกับที่ GRANTS เดิมสร้างขึ้นตามที่กล่าวไว้ที่นี่:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local


11
ทำ: 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 ถือว่าเงินช่วยเหลือเป็นวัตถุที่หยดน้ำได้
มิลลิโมส

1
โปรดชี้แจง @ Tim Kane และ millimoose: ฉันไม่ต้องการให้ตารางต้นฉบับถูกทิ้งจริงๆถ้าฉันเลือกให้ FOO เป็นผู้ทดสอบแล้วปล่อยให้ผู้ทดสอบเป็นเจ้าของ ฉันคิดว่าคุณกำลังบอกว่า DROP OWNED BY เป็นเพียงการทิ้งเงินช่วยเหลือ แต่จะไม่ทิ้งวัตถุที่มอบให้ แก้ไข?
Andrew Wolfe

1
แอนดรูควรอ่านเอกสารเพื่อชี้แจง DROP OWNED BY จะวางตารางที่เป็นของผู้ใช้นั้น การลงทะเบียนใหม่เป็นของตัวเองจะกำหนดตารางเหล่านั้นใหม่ให้กับผู้ใช้รายอื่น เลือกมาหนึ่งอย่าง.
Tim Kane

3
หากคุณกังวลว่า DROP เป็นเจ้าของโดยการออกมากเกินไปหลังจากทำ REASSIGN OWNED เมื่อยังมีสิทธิ์อยู่คุณสามารถเพิกถอนทั้งหมดได้ในทุก [ตาราง | ลำดับ | ... ] ใน SCHEMA [ชื่อสคีมา] จาก [บทบาท]
jla

อันที่จริงคำสั่ง DROP OWNED BY นั้นค่อนข้างคลุมเครือในความหมายและผลกระทบ ฉันต้องอ่านเอกสารอย่างละเอียดเพื่อให้ถูกต้อง ขอบคุณสำหรับคนโพสต์
SébastienClément

49

คำตอบที่ยอมรับส่งผลให้เกิดข้อผิดพลาดสำหรับฉันเมื่อพยายามลงชื่อใหม่เป็นของตัวเองหรือปล่อยให้เป็นของตัวเอง สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน:

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%';

ฉันไม่แน่ใจว่าสิทธิพิเศษประเภทใดที่สอดคล้องกับการเพิกถอนตารางลำดับหรือฟังก์ชัน แต่ฉันคิดว่าสิทธิ์ทั้งหมดอยู่ภายใต้หนึ่งในสาม


12
ฉันต้องเพิ่มอันนี้ด้วย:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas

3
สิทธิ์สคีมาด้วย
greatvovan

2
สำหรับสิทธิ์สคีมา:revoke USAGE on SCHEMA some_schema from username;
Alphaaa

ฉันลองแล้ว แต่ปัญหายังคงอยู่ในกรณีของฉัน ฉันโพสต์เป็นคำถามแยกต่างหากในstackoverflow.com/questions/61168608/…
Andrus

17

โปรดทราบว่าหากคุณได้รับอนุญาตอย่างชัดเจน:

CONNECT ON DATABASE xxx TO GROUP ,

คุณจะต้องเพิกถอนสิ่งนี้แยกจาก DROP OWNED BY โดยใช้:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


ฉันได้ลองทำทุกอย่างข้างต้นแล้ว แต่ก็ยังไม่ได้ผลสำหรับฉันจนกระทั่งฉันเลื่อนลงไปอีกเล็กน้อยตอนนี้ฉันจึงเหลือผมอยู่บ้าง บาง. : D ขอบคุณครับ !!
Mitch Kent

6

ฉันต้องเพิ่มอีกหนึ่งบรรทัดเพื่อเพิกถอน ...

หลังจากทำงาน:

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;

คุณอาจต้องเพิกถอนสิทธิ์สำหรับ "SCHEMA pg_catalog" เช่นสร้างผู้ใช้สำหรับ pg_rewind ซึ่งมีสิทธิ์เหนือฟังก์ชันเช่น pg_read_binary_file
GreenReaper

5

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

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 ;

2

ไม่มี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";


-19

ฉันประสบปัญหาเดียวกันและตอนนี้พบวิธีแก้ไขแล้ว ก่อนอื่นคุณต้องลบฐานข้อมูลของผู้ใช้ที่คุณต้องการทิ้ง จากนั้นผู้ใช้สามารถลบได้อย่างง่ายดาย

ฉันสร้างผู้ใช้ชื่อ "msf" และพยายามอยู่ครู่หนึ่งเพื่อลบผู้ใช้และสร้างใหม่ ฉันทำตามขั้นตอนด้านล่างและประสบความสำเร็จ

1) วางฐานข้อมูล

dropdb msf

2) ปล่อยผู้ใช้

dropuser msf

ตอนนี้ฉันปล่อยผู้ใช้สำเร็จแล้ว


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