GRANT
s trên các đối tượng khác nhau là riêng biệt. GRANT
nhập vào cơ sở dữ liệu không GRANT
quyền đối với lược đồ bên trong. Similiarly, GRANT
nhập vào một lược đồ không cấp quyền trên các bảng bên trong.
Nếu bạn có quyền đối với SELECT
từ một bảng, nhưng không có quyền xem nó trong lược đồ chứa nó thì bạn không thể truy cập vào bảng.
Các bài kiểm tra quyền được thực hiện theo thứ tự:
Do you have `USAGE` on the schema?
No: Reject access.
Yes: Do you also have the appropriate rights on the table?
No: Reject access.
Yes: Check column privileges.
Sự nhầm lẫn của bạn có thể nảy sinh do public
giản đồ có GRANT
mặc định tất cả các quyền đối với vai trò public
, mà mọi người dùng / nhóm đều là thành viên. Vì vậy, mọi người đã có cách sử dụng trên lược đồ đó.
Cụm từ:
(giả sử rằng các yêu cầu đặc quyền riêng của đối tượng cũng được đáp ứng)
Có nghĩa là bạn phải có USAGE
trên một lược đồ để sử dụng các đối tượng bên trong nó, nhưng có USAGE
trên một lược đồ tự bản thân nó không đủ để sử dụng các đối tượng trong lược đồ, bạn cũng phải có quyền đối với chính các đối tượng đó.
Nó giống như một cây thư mục. Nếu bạn tạo một thư mục somedir
với tệp somefile
bên trong nó, sau đó đặt nó để chỉ người dùng của riêng bạn có thể truy cập vào thư mục hoặc tệp (mode rwx------
trên dir, mode rw-------
trên tệp) thì không ai khác có thể liệt kê thư mục để biết rằng tệp tồn tại.
Nếu bạn cấp quyền đọc trên toàn thế giới đối với tệp (mode rw-r--r--
) nhưng không thay đổi quyền của thư mục sẽ không có gì khác biệt. Không ai có thể nhìn thấy để đọc được tệp, vì họ không có quyền liệt kê thư mục.
Nếu thay vào đó bạn đặt rwx-r-xr-x
trên thư mục, đặt nó để mọi người có thể liệt kê và xem qua thư mục nhưng không thay đổi quyền đối với tệp, mọi người có thể danh sách tệp nhưng không thể đọc vì họ không có quyền truy cập vào tệp.
Bạn cần đặt cả hai quyền để mọi người thực sự có thể xem tệp.
Điều tương tự trong Pg. Bạn cần cả hai giản đồ USAGE
quyền và quyền đối tượng để thực hiện một hành động trên một đối tượng, chẳng hạn như SELECT
từ một bảng.
(Tương tự giảm xuống một chút là PostgreSQL chưa có bảo mật cấp hàng, vì vậy người dùng vẫn có thể "thấy" rằng bảng tồn tại trong lược đồ bằng cách SELECT
ing từ pg_class
trực tiếp. Tuy nhiên, họ không thể tương tác với nó theo bất kỳ cách nào, vì vậy nó chỉ là phần "danh sách" không hoàn toàn giống nhau.)