2011-04-19 51 views
17

Làm thế nào để bạn xem người dùng đã được phát hành GRANT CONNECT ON DATABASE <database> TO <user>?PostgreSQL: Xem quyền kết nối cơ sở dữ liệu

  • \ dp - danh sách bảng/xem quyền
  • \ dn + - danh sách quyền schema
  • \ l + không liệt kê tất cả người dùng có thể truy cập cơ sở dữ liệu
+0

Wow câu hỏi này cũ và có vẻ như tôi chưa bao giờ chọn câu trả lời. Tôi nghĩ đó là vì lúc đó tôi đang tìm kiếm thứ gì đó hơn. Tôi đã không xem xét điều này trong một thời gian, vì vậy tôi xin lỗi nếu điều này là sai. Tôi đoán rằng tệp pg_hba.conf cho phép người dùng kết nối với máy chủ, mà không có quyền cấp phép rõ ràng đang được truyền. Do đó, các cơ sở dữ liệu chưa bị khóa sẽ có thể được truy cập bởi bất kỳ ai hầu như được cho phép, mà lệnh '\ l' có thể không bao giờ có thể biết được. – vol7ron

Trả lời

0

Tôi đang sử dụng psql từ postgres 8.4 và postgres 9.0, và lệnh \l hoặc \l+ cho tôi cột Access Privileges nơi tôi có mục nhập:

<user_name>=c/<database_name> 

và trước đó tôi đã cấp cho người dùng đặc quyền kết nối như bạn muốn.

Vì nó nêu trên trang http://www.postgresql.org/docs/9.0/static/sql-grant.html, các c chữ cái ở đây có nghĩa là Connect.

+0

Phải, nhưng không liệt kê tất cả người dùng. Tôi nghĩ đây có thể là một hạn chế. Hoặc có lẽ pg_hba.conf đang làm điều gì đó trước. – vol7ron

18

Một chút lẻ nếu lệnh \ l + chỉ hiển thị một số người dùng có quyền/đặc quyền để kết nối với cơ sở dữ liệu. Tôi không thể lặp lại bản thân mình khi cài đặt PostgreSQL 8.4 (Ubuntu 10.04 LTS). Phiên bản nào bạn đang sử dụng?

Dù sao, có lẽ bạn có thể kiểm tra bảng giữ của ACL cho rằng cơ sở dữ liệu cụ thể và từ đó suy ra cho dù người dùng có đặc quyền đúng hay không:

SELECT datname as "Relation", datacl as "Access permissions" FROM pg_database WHERE datname = 'databasename'; 

Nếu bạn chỉ muốn kiểm tra một người dùng mà bạn có thể làm điều gì đó như sau:

SELECT * FROM has_database_privilege('username', 'database', 'connect'); 

Quyền/đặc quyền được diễn giải như thế nào? Các đặc quyền sẽ được đọc như sau:

user = privileges/granted by 

Người dùng bỏ qua có nghĩa là PUBLIC được cấp đặc quyền, nghĩa là tất cả các vai trò. Ví dụ: nếu đặc quyền là =Tc/postgres thì tất cả các vai trò có thể kết nối và tạo các bảng tạm thời trong cơ sở dữ liệu cụ thể đó và đó là người dùng postgres đã cấp đặc quyền.

Có một bản tóm tắt tại trang PostgreSQL giải thích các đặc quyền khác nhau tại trang PostgreSQL http://www.postgresql.org/docs/9.2/static/sql-grant.html.

rolename=xxxx -- privileges granted to a role 
     =xxxx -- privileges granted to PUBLIC 

      r -- SELECT ("read") 
      w -- UPDATE ("write") 
      a -- INSERT ("append") 
      d -- DELETE 
      D -- TRUNCATE 
      x -- REFERENCES 
      t -- TRIGGER 
      X -- EXECUTE 
      U -- USAGE 
      C -- CREATE 
      c -- CONNECT 
      T -- TEMPORARY 
     arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects) 
      * -- grant option for preceding privilege 

     /yyyy -- role that granted this privilege 
+0

John, tôi sẽ xem xét điều này. Tôi tin rằng tôi đã thử nghiệm trên một phiên bản 8.4 là tốt. Tôi nghĩ rằng tôi có thể truy vấn nó, nhưng tôi đã hy vọng rằng sẽ có một lệnh tắt để làm điều đó. Bất kể, tôi sẽ phải xem nếu tôi nhớ trường hợp duy nhất đã mang lại sự chú ý của tôi. – vol7ron

+0

Đã một thời gian kể từ khi tôi thấy câu hỏi này. 8.4 và không, tôi biết có những tài khoản có thể truy cập cơ sở dữ liệu không được hiển thị trong danh sách ... trừ khi ...Hỏi: có nghĩa là gì khi không có người dùng nào được liệt kê trước dấu bằng trong '= Tc/'? Điều đó có nghĩa là bất kỳ ai có kết nối tạm thời không? – vol7ron

+0

Có. Câu hỏi hay bằng cách này, tôi đã cập nhật câu trả lời cách các đặc quyền được diễn giải. –

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