如何授权某个用户只能访问PostgreSQL的某个库?

数据库关系型数据库技术服务知识库
问题描述

如何对 PostgreSQL 新建用户实现只能访问某个数据库,而其他数据库则无权限,我们应该如何进行授权?

问题分析

若创建的表没有指定模式,就会在 public 模式下,默认情况下每个人在 public 模式下都有CREATE 和 USAGE 权限,也就是说,允许所有可以连接到指定数据库上的用户在这里创建对象。所以我们要回收对应的权限让其无法访问。

问题复现

创建新的用户和数据库,可以看到默认情况下,新建的用户没有赋予任何权限,就可以在 public schema 中进行创建表以及插入数据的操作。

postgres=# create user test2 with Login password 'xxxxxx';
CREATE ROLE
postgres=# \c postgres test2;
You are now connected to database "postgres" as user "test2".
postgres=> create table testtable(id int);
CREATE TABLE
postgres=> insert into testtable values(1);
INSERT 0 1
```
`
# 解决方案
如果我们希望新建的用户只具有指定数据库的相关权限,我们需要使用最高权限用户去掉 test2 用户对其他库下 public schema 的 Create 权限。
```sql
postgres=# revoke CREATE ON SCHEMA public FROM test2;

# 切换到 test2 用户验证权限
testdb=> \c lxb;
You are now connected to database "lxb" as user "test2".
lxb=> \dt;
         List of relations
 Schema |  Name  | Type  |  Owner   
--------+--------+-------+----------
 public | test01 | table | postgres
(1 row)

# 在其他库中没有权限查看其他 owner 的表内容

lxb=> select * from test01;
ERROR:  permission denied for table test01

# 在其他库 lxb 下没有权限创建表
lxb=> create table test04(id int);
ERROR:  permission denied for schema public

```

注意生产权限的修改一定要在测试环境充分验证,并记录修改前权限,有对应的回滚方案,避免影响线上业务。

**如果您有其他问题,欢迎您联系火山引擎**[技术支持服务](https://console.volcengine.com/ticket/createTicketV2/)

203
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论