问题描述
如何对 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/)