浅谈PostgreSQL用户权限

database

问题

  经常在PG群里看到有人在问“为什么我对表赋予了权限;但是还是不能访问表”

解析

  若你看懂德哥这篇文章PostgreSQL逻辑结构和权限体系介绍上面对你就不是困扰你的问题

  解决这个问题很简单;在解决之前;我们要先了解PostgreSQL的逻辑结构、以及与用户之间的关系盗用德哥的图;来诠释下逻辑结构;PostgreSQL逻辑结构有4层:实例->数据库->schema->数据库对象

 

  可以看出用户不在PostgreSQL里面;是独立之外的object;这个跟Oracle逻辑结构不一致。它不属于某个数据库、或者某个schema。

  若用户不是数据库属主的用户;要访问table1;该怎么办?有三步

  • 首先你把数据库select的权限赋予用户
  • 再则你需要把table1所在的schema的select权限赋予用户
  • 最后你需要把table的select的权限赋予

讨论

  现实验环境

  • 用户:lottu1、lottu2。
  • 数据库:db1
  • schema:lottu1
  • 表:tbl_lottu_01

# 创建用户lottu1

postgres=# createuser lottu1;

CREATE ROLE

# 创建用户lottu2

postgres=# createuser lottu2;

CREATE ROLE

# 创建数据库db1;属于lottu1

postgres=# createdatabase db1 owner lottu1;

CREATEDATABASE

# 创建schema、table、并插入记录

postgres=# c db1 lottu1;

You are now connected todatabase "db1" asuser "lottu1".

db1=>createschema lottu1;

CREATESCHEMA

db1=>createtable tbl_lottu_01(id int, info text, reg_time timestamp);

CREATETABLE

db1=>insertinto tbl_lottu_01 select1,"lottu",now();

INSERT01

  新建的数据库对所有的用户都有连接权限;不管是不是超级用户、属主用户

db1=> c db1 lottu2

You are now connected todatabase "db1" asuser "lottu2".

  针对这种情况;这样是不是很不安全;非主用户为啥可以连数据库;虽然它不可以做任何操作。但是觉得还是没有完全隔离。要实现隔离;我们可以回收数据库权限;只有超级用户、属主用户可以连。

db1=> c db1 postgres

You are now connected todatabase "db1" asuser "postgres".

db1=# revoke CONNECT ONDATABASE db1 frompublic;

REVOKE

db1=# c db1 postgres

You are now connected todatabase "db1" asuser "postgres".

db1=# c db1 lottu1;

You are now connected todatabase "db1" asuser "lottu1".

db1=> c db1 lottu2;

FATAL: permission denied fordatabase "db1"

DETAIL: User does not have CONNECT privilege.

Previous connection kept

  现在实现用户lottu2不能连接数据库db1。现在需求tbl_lottu_01给db2查询。而表tbl_lottu_01属于数据库db1下面schema-lottu1的。

db1=>grant CONNECT ONDATABASE db1 to lottu2;

GRANT

db1=>grant USAGE ONSCHEMA lottu1 to lottu2;

GRANT

db1=>grantselectonTABLE tbl_lottu_01 to lottu2;

GRANT

db1=> c db1 lottu2;

You are now connected todatabase "db1" asuser "lottu2".

db1=>select*from lottu1.tbl_lottu_01;

id | info | reg_time

----+-------+----------------------------

1| lottu |2020-05-1910:50:15.206569

(1 row)

  经过一层层的赋权;用户lottu2可以select表tbl_lottu_01。若需求将schema-lottu1下所有的表都赋于给lottu2。将上面的修改下即可

grantselectonALL TABLES INSCHEMA lottu1 to lottu2;

以上是 浅谈PostgreSQL用户权限 的全部内容, 来源链接: utcz.com/z/533723.html

回到顶部