Cấp quyền truy cập vào tất cả các bảng cho người dùng


151

Tôi mới sử dụng Postgres và đang cố gắng di chuyển cơ sở dữ liệu MySQL của chúng tôi. Trong MySQL tôi có thể cấp SELECT, UPDATE, INSERT, và DELETEcác đặc quyền trên một người sử dụng đặc quyền thấp và cho phép những khoản tài trợ để áp dụng cho tất cả các bảng trong cơ sở dữ liệu cụ thể. Tôi phải thiếu một cái gì đó trong Postgres vì ​​có vẻ như tôi phải cấp các đặc quyền đó cho từng bảng một. Với nhiều cơ sở dữ liệu và hàng trăm bảng cho mỗi cơ sở dữ liệu có vẻ như là một nhiệm vụ khó khăn chỉ để khởi đầu. Ngoài ra, một khi cơ sở dữ liệu đang hoạt động, việc thêm các bảng xảy ra thường xuyên đến mức tôi không muốn phải cấp quyền mỗi lần trừ khi thực sự cần thiết.

Làm thế nào là hoàn thành tốt nhất này?

Câu trả lời:


175

Đầu tiên, bạn phải có khả năng kết nối với cơ sở dữ liệu để chạy các truy vấn. Điều này có thể đạt được bởi

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

Điều REVOKEnày là cần thiết bởi vì

Từ khóa PUBLIC chỉ ra rằng các đặc quyền sẽ được cấp cho tất cả các vai trò, bao gồm cả các vai trò có thể được tạo sau này. PUBLIC có thể được coi là một nhóm được xác định ngầm luôn bao gồm tất cả các vai trò. Bất kỳ vai trò cụ thể nào cũng sẽ có tổng số đặc quyền được cấp trực tiếp cho nó, đặc quyền được cấp cho bất kỳ vai trò nào hiện tại là thành viên và đặc quyền được cấp cho PUBLIC.

Nếu bạn thực sự muốn hạn chế người dùng của mình đối với các câu lệnh DML, thì bạn có thêm một chút việc phải làm:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

Chúng giả định rằng bạn sẽ chỉ có một lược đồ (được đặt tên là 'công khai' theo mặc định).

Như Jack Douglas đã chỉ ra, ở trên chỉ cung cấp các đặc quyền cho các bảng đã có sẵn . Để đạt được điều tương tự cho các bảng trong tương lai, bạn phải xác định các đặc quyền mặc định :

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

Ở đây, some_rolelà một vai trò tạo ra các bảng, trong khi đó user_namelà người nhận được các đặc quyền. Xác định điều này, bạn phải đăng nhập với tư cách some_rolelà thành viên của nó.

Và cuối cùng, bạn phải làm tương tự cho các chuỗi (cảm ơn StripeFan vì đã chỉ ra nó) - đây là USAGEđặc quyền mà bạn cần.


1
Cảm ơn, FOR some_rolelà phần quan trọng tôi đã thiếu để làm cho nó hoạt động cho các bảng của tôi được tạo sau này. Nhưng tôi không phải đăng nhập some_role, nó cũng hoạt động nếu tôi thực hiện truy vấn với tư cách là postgresngười dùng quản trị mặc định .
JustAMartin

54

giả sử bạn muốn cung cấp cho họ tất cả các đặc quyền - hãy làm điều này:

grant all privileges on database dbname to dbuser;

nơi dbnamelà tên của cơ sở dữ liệu của bạn và dbuserlà tên của người dùng.


44
Điều này sẽ thêm các đặc quyền sau trên cơ sở dữ liệu : CREATE, CONNECT, TEMPORARY. Không có đặc quyền trên bàn.
dezso

13
Một lệnh tương tự cho tất cả các bảng sẽ là,GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci

5
Tôi cũng thấy điều này hữu ích:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo

18

Cấp tất cả các đặc quyền cho tất cả các bảng trong cơ sở dữ liệu đạt được với

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

Có thể là tôi đã làm điều gì đó sai ở đây vì tôi rất mới với PostgreSQL. Nhưng điều này chỉ giải quyết được phần đầu tiên của vấn đề đối với tôi - thiết lập các đặc quyền trên tất cả các bảng hiện có.

Để các quyền được đặt chính xác cho người dùng của tôi trên các bảng mới, được tạo, tôi phải đặt quyền mặc định cho người dùng:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
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.