首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PostgreSQL-用户和权限(二)

PostgreSQL-用户和权限(二)

作者头像
运维小路
发布2026-01-26 12:26:10
发布2026-01-26 12:26:10
880
举报
文章被收录于专栏:运维小路运维小路

作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL

PostgreSQL(本章节)

MongoDB

Redis

Etcd

上个小节我们对PostgreSQL做了基本介绍,最后配置出来的账号大约等同于MySQL的xx账号具有连接xxx的能力,本小节继续介绍其他权限。

组权限

我们这里构建一个场景,2个(甚至更多个)应用都会使用同一个库,各自都有自己的密码,权限有组进行统一管控。

1. 创建组角色并授予数据库权限
代码语言:javascript
复制
-- 创建组角色(无需登录权限,仅用于权限聚合)
CREATE ROLE app_group NOLOGIN;
-- 授予组角色对目标数据库的连接权限
GRANT CONNECT ON DATABASE 目标库名 TO app_group;
-- 切换到目标数据库(必须先连接才能授予库内权限)
\c 目标库名;
-- 授予组角色对 public 模式的访问权限
GRANT USAGE ON SCHEMA public TO app_group;
-- 授予组角色对现有表的操作权限(根据需求调整,如 CRUD)
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_group;

2.为应用创建用户角色并加入组

代码语言:javascript
复制
-- 创建应用1的用户(带登录权限和密码)
CREATE USER app1_user WITH LOGIN PASSWORD 'app1_pwd';
-- 创建应用2的用户
CREATE USER app2_user WITH LOGIN PASSWORD 'app2_pwd';
-- 将用户加入组角色,继承组的所有权限
GRANT app_group TO app1_user;
GRANT app_group TO app2_user;
  • 权限统一管理:修改 app_group 的权限,所有应用用户自动继承,无需逐个调整。
  • 最小权限隔离:应用用户仅拥有组角色赋予的权限,避免直接授予超级权限。
  • 灵活扩展:新增应用时,只需创建新用户并加入组即可,无需重复配置权限。

权限继承

通过我们上个小节或者前面的配置,如果我们配置的时候库里面已经有10个表,但是我们后面业务增加还会出现新的库表。上面的配置账号是没有权限操作新表的。

这是 PostgreSQL 权限管理的一个重要特性 ——权限不会自动应用于未来新建的对象,必须通过额外配置才能让新表继承权限。

如果希望 myuser 对未来在 public 模式中新建的表也自动拥有 ALL 权限,需要使用 ALTER DEFAULT PRIVILEGES 命令:

代码语言:javascript
复制
-- 对未来在 public 模式中新建的表,自动授予 myuser 所有权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT ALL ON TABLES TO myuser;
代码语言:javascript
复制
-- 也可以指定新创建指定的权限 
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT ON TABLES TO myuser;

权限回收(REVOKE

讲解回收权限之前需要明白一个概念就是GRANT 是 “叠加” 而非 “覆盖”,所以多次执行权限,只能增加权限,而不会减少权限。要减少就必须使用权限回收。

假设用户原本拥有 SELECT, INSERT, UPDATE, DELETE 权限:

  • 执行 REVOKE DELETE ON TABLE users FROM myuser; 用户剩余权限为 SELECT, INSERT, UPDATE
  • 执行 GRANT SELECT, INSERT, UPDATE ON TABLE users TO myuser; 它的实际权限是不变的。

对于通过角色继承获得的权限,必须从被继承的角色(父角色)中回收权限,才能彻底移除用户的该权限。直接对用户执行 REVOKE 无效,因为用户的权限来源于角色,而非直接授予。

示例场景:

  • 角色 app_group 被授予了 users 表的 DELETE 权限。
  • 用户 myuserapp_group 的成员(即 myuser 继承了 app_group 的权限)。

正确操作:从父角色回收权限

代码语言:javascript
复制
-- 从 app_group 中回收 DELETE 权限
REVOKE DELETE ON TABLE users FROM app_group;

错误操作:直接对用户回收(无效)

代码语言:javascript
复制
-- 直接对 myuser 执行 REVOKE 无法移除继承的权限
REVOKE DELETE ON TABLE users FROM myuser;  -- 无效!

查看权限

代码语言:javascript
复制
postgres=# \x
Expanded display is on.
postgres=# SELECT * FROM pg_roles WHERE rolname = 'myuser';
-[ RECORD 1 ]--+---------
rolname        | myuser
rolsuper       | f #是否未超级角色
rolinherit     | t  #是否允许继承权限 
rolcreaterole  | f  #是否允许创建角色 
rolcreatedb    | f  #是否允许创建数据库 
rolcanlogin    | t  #是否允许登录
rolreplication | f  #是否允许复制(主从配置 )
rolconnlimit   | -1 #是否有连接数限制 
rolpassword    | ********
rolvaliduntil  | 
rolbypassrls   | f
rolconfig      | 
oid            | 16386
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB
    • 1. 创建组角色并授予数据库权限
    • 示例场景:
    • 正确操作:从父角色回收权限
    • 错误操作:直接对用户回收(无效)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档