GRANT ALL ON ALL TABLES IN SCHEMA 不允许用户查看表

Chr*_*isM 6 postgresql permissions psql users

我有一个非常简单的脚本来创建一个新数据库并创建一个新用户来访问这个数据库。这是由默认的 postgres 用户运行的。授予用户对数据库和模式的访问权限后,新创建的用户仍然无法看到\dtpsql 中使用的表。以下是脚本的一些片段,以显示我迄今为止尝试过的内容:

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;
Run Code Online (Sandbox Code Playgroud)

运行后,\dt以 postgres 用户身份登录时显示 psql 中的所有表。 以 api 用户身份登录时\dt显示Did not find any relations.

\dn+与 postgres 用户一起运行为我提供了以下信息:

  Name  |  Owner   |   Access privileges   |      Description       
--------+----------+-----------------------+------------------------
 public | postgres | postgres=UC/postgres +| standard public schema
        |          | =UC/postgres         +| 
        |          | api=UC/postgres       | 
Run Code Online (Sandbox Code Playgroud)

版本信息: 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 问题并尝试了所有建议的方法,但仍然没有运气。还有什么我可以检查或尝试的吗?我的预感是我错过了一些明显的东西。

Sah*_*sci 3

创建一个组,这意味着一个ROLEwith NOLOGIN.

CREATE ROLE api_group NOLOGIN;
Run Code Online (Sandbox Code Playgroud)

创建(如果需要,可以先删除)数据库。然后连接到该数据库。

CREATE DATABASE new_db;
\c new_db
Run Code Online (Sandbox Code Playgroud)

为您的组添加默认权限。下面的代码表示postgres角色是否创建一个授予ALL该角色的对象api_group。您可以更具体(例如 SELECT、INSERT、USAGE 等),而不是 ALL。

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 ;
Run Code Online (Sandbox Code Playgroud)

现在您可以使用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....
Run Code Online (Sandbox Code Playgroud)

设置已准备就绪。如果您添加新用户(可以说),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;
Run Code Online (Sandbox Code Playgroud)

文档的建议部分;