6.用户及权限管理

用户及权限管理

用户和角色

什么是角色?

角色是一系列相关权限的集合。为了管理方便,通常把一系列相关的数据库权限赋给一个角色,如果哪个用户需要这些权限,就把角色赋给相应的用户。

在 PostgreSQL 中,为了简化管理,角色与用户是没有区别的,一个用户也是一个角色,我们可以把一个用户的权限赋给另一个用户。

用户和角色在整个数据库实例中是全局的,在同一个实例中的不同数据库中,看到的用户都是相同的。

超级用户

  • 超级用户是初始化该数据库时与操作系统用户名相同的用户。
  • 如果数据库是建在操作系统用户 postgres 下的(通常我们把数据库安装在此用户下),那么这个数据库超级用户的名称也叫 postgres
  • 在超级用户下可以创建更多的普通用户。

创建用户和角色

语法

sql 复制代码
CREATE ROLE name [ [ WITH ] option [ ... ] ]
CREATE USER name [ [ WITH ] option [ ... ] ]

option 取值介绍

  • SUPERUSER | NOSUPERUSER:表示创建出来的用户是否为超级用户。
  • CREATEDB | NOCREATEDB:指定创建出来的用户是否有执行 CREATE DATABASE 的权限。
  • CREATEROLE | NOCREATEROLE:指定创建出来的用户是否有创建其他角色的权限。
  • CREATEUSER | NOCREATEUSER:指定创建出来的用户是否有创建其他用户的权限。
  • LOGIN | NOLOGIN:创建出来的用户是否有 LOGIN 权限,可以临时禁止用户的 LOGIN 权限,此时用户无法连接到数据库。

权限的管理

用户的权限分为两类:

第一类:创建用户时指定的权限

  1. 超级用户的权限
  2. 创建数据库的权限
  3. 是否允许 LOGIN 的权限

第二类:由 GRANTREVOKE 命令管理的权限

  1. 在数据库中创建模式(SCHEMA)的权限
  2. 允许在指定的数据库中创建临时表的权限
  3. 连接某个数据库的权限
  4. 在模式中创建数据库对象的权限,如创建表、视图、函数等
  5. 在一些表中做 SELECTUPDATEINSERTDELETE 等操作的权限
  6. 在一张具体的表的列上进行 SELECTUPDATEINSERT 操作的权限
  7. 在表上创建触发器的权限
  8. 把表、索引等建到指定表空间的权限

注意

在使用时要分清上述两类权限:

  • 如果要给用户赋予创建数据库的权限,需要使用 ALTER ROLE 命令。
  • 要给用户赋予创建模式的权限时,则需要使用 GRANT 命令。

PostgreSQL 中的 DDL 权限

PostgreSQL 没有专门的 DDL 语句权限,能否创建表取决于在模式(SCHEMA)中是否有 CREATE 的权限。

函数和触发器的权限

为了加强安全性,PostgreSQL 只允许超级用户使用某些 PL 语言写函数。


权限的层次总结

PostgreSQL 中的权限是按以下几个层次进行管理的:

  1. 首先管理用户特殊属性上的权限,如超级用户权限、创建数据库的权限、创建用户的权限、LOGIN 权限等。
  2. 然后是在数据库中创建模式的权限。
  3. 接着是在模式中创建数据库对象的权限,如创建表、索引等。
  4. 之后是查询表、向表中插入数据、更新表、删除表中数据的权限。
  5. 最后是操作表中某些字段的权限。

如何创建一个只读用户

第一步:收回默认的创建表权限

sql 复制代码
REVOKE CREATE ON SCHEMA public FROM public;

这是因为在 PostgreSQL 中,默认任何用户都可以在名为 public 的 Schema 中创建表,而只读用户是不允许创建表的,所以先要把此权限收回。

第二步:创建一个名为 readonly 的用户

sql 复制代码
CREATE USER readonly WITH PASSWORD 'query';

第三步:将现有表的 SELECT 权限赋予用户 readonly

sql 复制代码
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

注意:上面的 SQL 命令只是把现有表的权限赋予了用户 readonly,如果此时创建了新表,readonly 用户仍不能读取。

第四步:设置默认权限,使新创建的表自动授权

sql 复制代码
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

注意:以上过程只是给名为 public 的 Schema 下的表赋予了只读权限,如果想让该用户访问其他 Schema 下的表,需要类似地设置相应 Schema 的权限。


相关推荐
码农小卡拉4 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣504 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
wjhx5 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星5 小时前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发5 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐5 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly6 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客6 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.6 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐6 小时前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端