PostgreSQL - cách nhanh chóng loại bỏ một người dùng có các đặc quyền hiện có


122

Tôi đang cố gắng tạo người dùng DB bị hạn chế cho ứng dụng tôi đang làm việc và tôi muốn loại bỏ người dùng cơ sở dữ liệu Postgres mà tôi đang sử dụng để thử nghiệm. Có cách nào để loại bỏ người dùng mà không cần phải thu hồi tất cả các quyền của họ theo cách thủ công trước tiên hoặc thu hồi tất cả các quyền mà người dùng có không?

Câu trả lời:


144

Làm thế nào về

DROP USER <username>

Đây thực sự là một bí danh cho DROP ROLE.

Bạn phải loại bỏ rõ ràng bất kỳ đặc quyền nào được liên kết với người dùng đó, cũng như chuyển quyền sở hữu của nó sang các vai trò khác (hoặc bỏ đối tượng).

Điều này đạt được tốt nhất bởi

REASSIGN OWNED BY <olduser> TO <newuser>

DROP OWNED BY <olduser>

Sau này sẽ xóa mọi đặc quyền được cấp cho người dùng.

Xem tài liệu postgres để biết VAI TRÒ DROPmô tả chi tiết hơn về điều này.


Thêm vào:

Rõ ràng, việc cố gắng loại bỏ người dùng bằng cách sử dụng các lệnh được đề cập ở đây sẽ chỉ hoạt động nếu bạn đang thực thi chúng trong khi được kết nối với cùng một cơ sở dữ liệu mà GRANTS ban đầu đã được tạo, như đã thảo luận ở đây:

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


11
Thực hiện: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser đã đưa ra thông báo lỗi: ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo. Tuy nhiên, DROP OWNED BY testuserđã xảy ra mánh khóe, dường như Postgres coi các khoản tài trợ là những vật thể có thể thả xuống.
milimoose

1
Vui lòng làm rõ, @Tim Kane và millimoose: Tôi thực sự không muốn các bảng gốc bị loại bỏ nếu TÔI CẤP CHỌN TRÊN FOO CHO NGƯỜI KIỂM TRA và sau đó DROP SỞ HỮU CỦA NGƯỜI THỬ NGHIỆM. Tôi nghĩ bạn đang nói rằng DROP OWNED BY chỉ bỏ các khoản tài trợ nhưng sẽ không bỏ đối tượng mà khoản tài trợ đã được thực hiện. Chính xác?
Andrew Wolfe

1
Andrew, tốt nhất hãy đọc tài liệu để rõ hơn. DROP OWNED BY sẽ bỏ bảng do người dùng đó sở hữu. REASSIGN OWNED BY sẽ gán lại các bảng đó cho một người dùng khác. Chọn một.
Tim Kane

3
Nếu bạn lo lắng về việc DỪNG SỞ HỮU BẰNG CÁCH rút ra quá nhiều sau khi thực hiện ĐĂNG KÝ SỞ HỮU LẠI khi các đặc quyền vẫn còn giữ, bạn có thể KHÔI PHỤC TẤT CẢ TRÊN TẤT CẢ [BẢNG BIỂU | TÌM KIẾM | ...] TRONG SCHEMA [tên lược đồ] TỪ [vai trò]
jla

Thật vậy, lệnh DROP OWNED BY hơi mơ hồ về ý nghĩa và tác dụng của nó. Tôi đã phải đọc tài liệu một cách cẩn thận để làm cho nó đúng. Cảm ơn người đưa thư.
Sébastien Clément

49

Câu trả lời được chấp nhận đã dẫn đến lỗi cho tôi khi cố gắng ĐĂNG KÝ LẠI ĐƯỢC SỞ HỮU BỞI hoặc DROP SỞ HỮU BỞI. Những điều sau đây đã làm việc cho tôi:

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;

Người dùng có thể có đặc quyền trong các lược đồ khác, trong trường hợp đó, bạn sẽ phải chạy dòng REVOKE thích hợp với "công khai" được thay thế bằng lược đồ chính xác. Để hiển thị tất cả các lược đồ và loại đặc quyền cho người dùng, tôi đã chỉnh sửa lệnh \ dp để thực hiện truy vấn này:

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

Tôi không chắc loại đặc quyền nào tương ứng với việc thu hồi trên TABLES, SEQUENCES hoặc FUNCTIONS, nhưng tôi nghĩ tất cả chúng đều thuộc một trong ba loại.


12
Tôi đã có thêm một này là tốt:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas

3
Ngoài ra các đặc quyền của lược đồ.
greatvovan

2
Đối với đặc quyền giản đồ:revoke USAGE on SCHEMA some_schema from username;
Alphaaa

Tôi đã thử điều này nhưng vấn đề vẫn còn trong trường hợp của tôi. Tôi đã đăng nó dưới dạng câu hỏi riêng trong stackoverflow.com/questions/61168608/…
Andrus

17

Cũng lưu ý, nếu bạn đã cấp rõ ràng:

CONNECT ON DATABASE xxx TO GROUP ,

bạn sẽ cần phải thu hồi điều này một cách riêng biệt với DROP OWNED BY, bằng cách sử dụng:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


Tôi đã thử mọi thứ ở trên và nó vẫn không hoạt động với tôi, cho đến khi tôi cuộn xuống chỉ một chút nữa là đến đây, vì vậy bây giờ tôi còn lại một ít tóc. Một số. : D cảm ơn bạn !!
Mitch Kent

6

Tôi đã phải thêm một dòng nữa để REVOKE ...

Sau khi chạy:

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;

Tôi vẫn nhận được lỗi: không thể bỏ tên người dùng vì một số đối tượng phụ thuộc vào nó CHI TIẾT: đặc quyền cho giản đồ công khai

Tôi đã thiếu cái này:

REVOKE USAGE ON SCHEMA public FROM username;

Sau đó tôi đã có thể bỏ vai.

DROP USER username;

Bạn cũng có thể cần phải thu hồi đặc quyền cho 'SCHEMA pg_catalog' nếu chẳng hạn, bạn đã tạo người dùng cho pg_rewind có đặc quyền đối với các chức năng như pg_read_binary_file.
GreenReaper

5

Đây là những gì cuối cùng đã làm việc cho tôi:

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

Không có REVOKE ALL PRIVILEGES ON ALL VIEWS, vì vậy tôi đã kết thúc bằng:

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 $$;

và bình thường:

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";

để những điều sau thành công:

drop role "XUSER";

0

Trong dòng lệnh, có một lệnh dropusercó sẵn để thực hiện thả người dùng khỏi postgres.

$ dropuser someuser

-19

Tôi đã đối mặt với vấn đề tương tự và bây giờ đã tìm ra cách giải quyết nó. Đầu tiên, bạn phải xóa cơ sở dữ liệu của người dùng mà bạn muốn xóa. Sau đó, người dùng có thể dễ dàng bị xóa.

Tôi đã tạo một người dùng có tên "msf" và phải vật lộn một lúc để xóa người dùng đó và tạo lại nó. Tôi đã làm theo các bước dưới đây và đã thành công.

1) Bỏ cơ sở dữ liệu

dropdb msf

2) thả người dùng

dropuser msf

Bây giờ tôi đã bỏ thành công người dùng.


2
Đây là một cách tiếp cận tiêu hao không thể tin được, vì nó sẽ yêu cầu tôi tạo lại lược đồ cơ sở dữ liệu cho mỗi lần lặp lại công việc của mình. (Trong đó có liên quan có quyền hạt mịn trên một lược đồ cơ sở dữ liệu hiện có;. Tức là nó là tốt nhất nếu database schema vẫn không bị ảnh hưởng)
millimoose
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.