2012-02-12 40 views
7

Tôi có 3 vai trò: superuser, poweruser và user. Tôi có bảng "dữ liệu" và chức năng data_select và data_insert.postgresql 9.1 - bảng truy cập thông qua các chức năng

Bây giờ tôi muốn xác định, chỉ người siêu người dùng mới có thể truy cập vào bảng "dữ liệu". Poweruser và người dùng không thể truy cập trực tiếp vào bảng "dữ liệu", mà chỉ thông qua các chức năng.

Người dùng chỉ có thể chạy dữ liệu chức năng_select, poweruser có thể chạy cả data_select và data_insert.

Vì vậy, sau đó tôi có thể tạo người dùng alice, bob, ... và kế thừa các đặc quyền của người dùng hoặc người dùng poweuser.

Điều này thực sự có thể đạt được không? Tôi đang chiến đấu với điều này cho ngày thứ hai và không nhận được bất cứ nơi nào.

Cảm ơn bạn đã dành thời gian.

Trả lời

8

Có, điều này có thể thực hiện được.

"superuser" có thể là một thực tế superuser, postgres theo mặc định. Tôi đổi tên vai trò cho người dùng đơn giản thành usr, bởi vì user là một từ dành riêng - không sử dụng nó làm định danh.

CREATE ROLE usr; 
CREATE ROLE poweruser; 
GRANT usr TO poweruser; -- poweruser can do everything usr can. 

CREATE ROLE bob PASSWORD <password>; 
GRANT poweruser TO bob; 

CREATE ROLE alice PASSWORD <password>; 
GRANT usr TO alice; 

REVOKE ALL ON SCHEMA x FROM public; 
GRANT USAGE ON SCHEMA x TO usr; 

REVOKE ALL ON TABLE x FROM public; 
REVOKE ALL ON TABLE y FROM public; 

CREATE FUNCTION 
    ... 
SECURITY DEFINER; 

REVOKE ALL ON FUNCTION ... FROM public; 
GRANT EXECUTE ON FUNCTION a TO usr; 
GRANT EXECUTE ON FUNCTION b TO poweruser; 

Hoặc bạn có thể tạo vai trò daemon không đăng nhập để sở hữu các chức năng và giữ các quyền tương ứng trên bảng. Điều đó sẽ an toàn hơn.

Nếu bạn đang đi tuyến đường này, bạn sẽ yêu thíchALTER DEFAULT PRIVILEGES (được giới thiệu với PostgreSQL 9.0). More details in this related answer.

Đọc chương Writing SECURITY DEFINER Functions Safely trong sách hướng dẫn.

Các vấn đề liên quan