首页 > 解决方案 > PostgreSQL:仅在一个数据库中授予 CRUD 操作

问题描述

有没有办法仅在特定数据库上向用户授予 CRUD 操作?假设我的服务器上有 2 个数据库:database_alloweddatabase_forbiden

我在 postgreSQL 上创建了一个用户,并授予了以下权限:

CREATE ROLE crud_user LOGIN PASSWORD '###';


--Next commands are executed connected to the database
GRANT CONNECT ON DATABASE database_allowed TO crud_user ;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO crud_user;

但是,执行命令后,我只得到一个错误:

致命:不允许角色“crud_user”登录

我知道我可以执行: ALTER ROLE crud_user WITH LOGIN,但是,尽管用户只能在 上执行 CRUD 操作database_allowed,但他可以连接两者,并查看表名等...

有没有办法阻止在所有数据库上授予登录权限?

标签: postgresql

解决方案


crud_user由于其权限,您可以访问其他数据库PUBLIC

PUBLICPostgreSQL在创建对象时默认授予对某些类型对象的权限。PUBLIC默认情况下,不对表、表列、序列、外部数据包装器、外部服务器、大型对象、模式或表空间授予任何权限。对于其他类型的对象,默认授予的权限PUBLIC如下:CONNECTTEMPORARY(创建临时表)数据库权限;EXECUTE功能和程序的特权;语言和USAGE数据类型(包括域)的特权。当然,对象所有者REVOKE既可以默认也可以明确授予权限。

Postgres 文档特权

所以你会想跑

REVOKE CONNECT ON DATABASE database_forbidden FROM PUBLIC

推荐阅读