Postgresql

GRANT ALL ON ALL TABLES IN SCHEMA 不允許使用者查看表

  • October 29, 2018

我有一個非常簡單的腳本來創建一個新數據庫並創建一個新使用者來訪問這個數據庫。這是由預設的 postgres 使用者執行的。在授予使用者對數據庫和模式的訪問權限後,新創建的使用者仍然無法看到\dt在 psql 中使用的表。以下是腳本的一些片段,以顯示我到目前為止所嘗試的內容:

CREATE USER api WITH ENCRYPTED PASSWORD 'password';

ALTER DEFAULT PRIVILEGES 
   FOR USER api
   IN SCHEMA public
   GRANT ALL ON ALL TABLES TO api;


DROP DATABASE IF EXISTS new_db;
CREATE DATABASE new_db;


CREATE TABLE addresses (
   address_id INTEGER,
   address_line_1 VARCHAR(50) NOT NULL,
   address_line_2 VARCHAR(50),
   city VARCHAR(50) NOT NULL,
   state VARCHAR(2) NOT NULL,
   zipcode VARCHAR(12) NOT NULL,
   PRIMARY KEY (address_id)
);

-- Create more tables....

-- Added these in for good measure at the end:
GRANT all PRIVILEGES on DATABASE new_db to api;
GRANT ALL ON DATABASE new_db TO api;
GRANT ALL ON SCHEMA public to api;
GRANT ALL ON ALL TABLES IN SCHEMA public TO api;

執行後,\dt以 postgres 使用者身份登錄時顯示 psql 中的所有表。 以 api 使用者身份登錄時\dt顯示。Did not find any relations.

與 postgres 使用者一起執行\dn+會為我提供以下資訊:

 Name  |  Owner   |   Access privileges   |      Description       
--------+----------+-----------------------+------------------------
public | postgres | postgres=UC/postgres +| standard public schema
       |          | =UC/postgres         +| 
       |          | api=UC/postgres       | 

版本資訊: PostgreSQL 10.5 (Ubuntu 10.5-2.pgdg16.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609, 64-bit

到目前為止我遇到的其他 SO 問題:

我查看了無數 SO 問題並嘗試了所有建議,但仍然沒有運氣。還有什麼我可以檢查或嘗試的嗎?我的預感是我遺漏了一些明顯的東西。

創建一個組,這意味著一個ROLEwith NOLOGIN

CREATE ROLE api_group NOLOGIN;

創建(或根據需要先刪除)您的數據庫。然後連接到該數據庫。

CREATE DATABASE new_db;
\c new_db

為您的組添加預設權限。下面的程式碼說明了角色是否為postgres角色創建了對象授權。您可以更具體而不是 ALL(例如 SELECT、INSERT、USAGE 等)。ALL``api_group

ALTER DEFAULT PRIVILEGES FOR ROLE postgres ALL ON TABLES TO api_group ;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres ALL  ON SEQUENCES TO api_group ;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ALL  ON FUNCTIONS TO api_group ;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ALL  ON TYPES TO api_group ;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ALL  ON SCHEMAS TO api_group ;

現在您可以使用postgresuser 來創建新對象。

CREATE TABLE addresses (
   address_id INTEGER,
   address_line_1 VARCHAR(50) NOT NULL,
   address_line_2 VARCHAR(50),
   city VARCHAR(50) NOT NULL,
   state VARCHAR(2) NOT NULL,
   zipcode VARCHAR(12) NOT NULL,
   PRIMARY KEY (address_id)
);

-- Create more objects....

設置已準備就緒。api如果即使在創建所有對象之後添加新使用者(比如說) ,該使用者也將擁有所有權限。那裡的INHERIT關鍵字用於繼承它所屬的角色的權限。下面的程式碼創建 2 個使用者作為api_group.

CREATE ROLE api INHERIT WITH ENCRYPTED PASSWORD 'pwd' IN ROLE api_group;
CREATE ROLE another_api INHERIT WITH ENCRYPTED PASSWORD 'pwd' IN ROLE api_group;

建議的文件部分;

引用自:https://dba.stackexchange.com/questions/221209