云数据库 PostgreSQL PUBLIC 权限操作

在 PostgreSQL 中,创建某些类型的对象时,系统会默认向 PUBLIC 角色授予特定权限。默认向 PUBLIC 授予的权限如下,更多权限说明请参考 PostgreSQL 产品文档。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。
对象类型 默认 PUBLIC 权限
Databases CONNECT、TEMPORARY
Functions/Procedures EXECUTE
Languages USAGE
Data Types USAGE

向 PUBLIC 授予权限等同于向所有用户(包括未显式创建的用户)授予该权限。你可以按需求撤销这些默认 PUBLIC 权限,以便更精确地为数据库用户授权,下文将详细为你举例。

注意:说明:

假设你现在有两个数据库账号 am_a 和 dbadmin,详情如下所示,用户创建请参考 控制台操作指引:

其中数据库账号 dbadmin 是 database test_db 的 OWNER:

首先,我们使用账号 dbadmin 登录 database test_db,如下所示:

[am@VM-91-60-centos ~]$psql -h10.*.*.* -p5432 -Udbadmin -dtest_dbPassword for user dbadmin: psql (16.0, server 16.10)Type "help" for help.

切换到 am_a 账号,我们可以验证 am_a 通过 PUBLIC 拥有 database 的登录权限和系统表的查询权限,具体如下:

test_db=> \\c – am_apsql (16.0, server 16.10)You are now connected to database "test_db" as user "am_a".test_db=> select oid FROM pg_class LIMIT 1; oid —— 2619(1 row)

使用 dbadmin 账号回收 PUBLIC 权限后,am_a 账号无法访问系统表:

test_db=> \\c – dbadminPassword for user dbadmin: psql (16.0, server 16.10)You are now connected to database "test_db" as user "dbadmin".test_db=> REVOKE SELECT ON pg_class FROM PUBLIC;REVOKEtest_db=> \\c – am_aPassword for user am_a: psql (16.0, server 16.10)You are now connected to database "test_db" as user "am_a".test_db=> select oid FROM pg_class LIMIT 1;ERROR: permission denied for table pg_class

使用 dbadmin 账号回收 PUBLIC 权限后,am_a 账号无法连接数据库 test_db:

test_db=> \\c – dbadminPassword for user dbadmin: psql (16.0, server 16.10)You are now connected to database "test_db" as user "dbadmin".test_db=> REVOKE CONNECT ON DATABASE test_db FROM PUBLIC;REVOKEtest_db=> \\c – am_a Password for user am_a: connection to server at "10.*.*.*", port 5432 failed: FATAL: permission denied for database "test_db"DETAIL: User does not have CONNECT privilege.Previous connection kept

使用 dbadmin 账号重新授予 am_a 权限后,am_a 可以连接数据库 test_db,也可以访问系统表:

test_db=> \\c – dbadminpsql (16.0, server 16.10)You are now connected to database "test_db" as user "dbadmin".test_db=> GRANT CONNECT ON DATABASE test_db TO am_a;GRANTtest_db=> GRANT SELECT ON pg_class TO am_a;GRANTtest_db=> \\c – am_aPassword for user am_a: psql (16.0, server 16.10)You are now connected to database "test_db" as user "am_a".test_db=> select oid FROM pg_class LIMIT 1; oid —— 2619(1 row)

赞 (0)
上一篇 4天前
下一篇 4天前