系列专栏:PostgreSQL 从零到生产实战教程
阅读前置:无基础门槛,适合PG初学者、后端开发、运维工程师
核心收获:彻底搞懂PG角色与用户区别、权限分级(库级/Schema级/对象级)、GRANT/REVOKE授权撤销、角色继承机制、pg_hba.conf访问控制全配置,全程可落地实战。
很多开发者在使用PostgreSQL时,权限管理一直是高频踩坑点:分不清Role和User、授权后不生效、子角色无法继承父角色权限、本地能连远程连不上数据库等问题。
本文从零拆解PG完整权限体系,从核心概念、权限分级、命令实操、角色继承、访问控制配置全方位讲解,所有代码可直接复制运行,看完彻底吃透PG权限底层逻辑与实战用法。
一、PG核心概念:Role 与 User 的本质区别
1.1 核心底层逻辑
PostgreSQL没有独立的用户体系,所有账号统一为Role(角色),我们常说的User只是具备LOGIN登录权限的特殊Role。
官方定义:User = Role + LOGIN 属性,这是区别于MySQL的核心关键点(MySQL用户和角色是分离体系)。
1.2 两类角色详细对比
角色类型 | 核心属性 | 使用场景 | 创建语句 |
|---|---|---|---|
普通Role(角色组) | 默认 NOLOGIN,无登录权限,仅用于权限归集 | 统一管理权限,批量授权给多个用户,不直接登录数据库 |
|
User(登录用户) | 具备 LOGIN 属性,可密码登录数据库 | 业务账号、开发账号、运维登录账号 |
|
1.3 超级用户与普通用户权限差异
1. 超级用户(Superuser)
默认超级用户为postgres,拥有数据库所有权限,不受权限规则限制,可修改系统配置、访问所有数据、授权所有权限。
创建自定义超级用户:
CREATE ROLE admin_super WITH LOGIN PASSWORD '123456' SUPERUSER;生产环境严禁随意创建超级用户,仅保留默认postgres超级用户即可。
2. 普通用户
无SUPERUSER属性,默认仅拥有自身默认权限,所有库、表、Schema操作均需要手动授权,是业务系统的主流账号类型。
-- 标准普通业务用户 CREATE ROLE dev_user WITH LOGIN PASSWORD 'dev@123' INHERIT;二、PG权限三级体系:库级、Schema级、对象级
PostgreSQL权限严格分为三个层级,权限自上而下生效,高级权限不包含低级权限,需要单独授权,这是权限踩坑的核心原因。
2.1 库级权限(Database 级别)
控制用户对整个数据库的连接、创建子对象权限,核心权限:CONNECT、CREATE、TEMPORARY。
常用实战授权:
-- 授予用户连接指定数据库权限 GRANT CONNECT ON DATABASE test_db TO dev_user; -- 授予用户在数据库中创建Schema权限 GRANT CREATE ON DATABASE test_db TO dev_user;2.2 Schema级权限(模式级别)
Schema是数据库的子命名空间,相当于“文件夹”,控制用户对Schema的使用、创建对象权限,核心权限:USAGE、CREATE。
高频坑点:用户有库连接权限,无Schema USAGE权限,依然无法查询表数据。
-- 授予Schema访问权限(必须授权,否则查表报错) GRANT USAGE ON SCHEMA public TO dev_user; -- 授予Schema内创建表、视图权限 GRANT CREATE ON SCHEMA public TO dev_user;2.3 对象级权限(表/视图/函数 级别)
精准控制单表、单视图的增删改查、修改结构权限,是最小粒度权限控制。核心权限:SELECT、INSERT、UPDATE、DELETE、ALTER、TRUNCATE等。
-- 授予单表增删改查权限 GRANT SELECT,INSERT,UPDATE,DELETE ON TABLE user_info TO dev_user; -- 授予Schema下所有表的查询权限(批量授权) GRANT SELECT ON ALL TABLES IN SCHEMA public TO dev_user;三、核心命令实战:GRANT 授权 / REVOKE 撤销权限
3.1 GRANT 两种核心用法
GRANT在PG中有两大场景:授予对象权限、授予角色成员关系(角色继承核心)。
1. 授予数据库对象权限
语法:GRANT 权限列表 ON 对象类型 对象名 TO 角色/用户;
全量实战示例:
-- 1. 库级授权 GRANT CONNECT ON DATABASE test_db TO dev_user; -- 2. Schema级授权 GRANT USAGE,CREATE ON SCHEMA public TO dev_user; -- 3. 对象级批量授权 GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dev_user;2. 授予角色归属权限(角色继承前置)
将父角色授予子用户,让子用户继承父角色所有权限。
-- 创建父角色(权限组,无登录权限) CREATE ROLE dev_group NOLOGIN; -- 将父角色授予普通用户,完成权限绑定 GRANT dev_group TO dev_user;3.2 REVOKE 撤销权限实战
REVOKE是GRANT的反向操作,可精准撤销各级权限、角色归属,语法与GRANT完全对应。
-- 撤销表查询权限 REVOKE SELECT ON TABLE user_info FROM dev_user; -- 撤销Schema访问权限 REVOKE USAGE ON SCHEMA public FROM dev_user; -- 撤销用户的角色归属(取消继承权限) REVOKE dev_group FROM dev_user;四、PG角色继承机制(核心重点)
4.1 继承核心规则
1、角色默认开启INHERIT(继承)属性,可自动继承所属父角色的所有权限;
2、若角色设置NOINHERIT,则不会自动继承父角色权限,必须手动切换角色才能使用;
3、权限继承支持多级嵌套(A继承B,B继承C,A自动拥有C权限)。
4.2 完整继承实战案例
业务场景:创建超级权限组、只读权限组,多个用户批量继承组权限,统一管控。
-- 1. 创建层级角色组 CREATE ROLE read_group NOLOGIN; -- 只读组 CREATE ROLE write_group NOLOGIN; -- 读写组 -- 2. 给父角色授权 GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_group; GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA public TO write_group; -- 3. 创建普通用户(默认INHERIT开启) CREATE ROLE user1 WITH LOGIN PASSWORD 'user1@123'; CREATE ROLE user2 WITH LOGIN PASSWORD 'user2@123'; -- 4. 绑定角色,自动继承权限 GRANT read_group TO user1; GRANT write_group TO user2; -- 5. 验证:user1仅能查询,user2可增删改查4.3 NOINHERIT 特殊场景实战
适用于需要临时切换权限、禁止自动继承的高安全场景:
-- 创建禁止自动继承的用户 CREATE ROLE temp_user WITH LOGIN PASSWORD 'temp@123' NOINHERIT; -- 绑定父角色权限组 GRANT write_group TO temp_user; -- 此时temp_user默认无write_group权限,需要手动切换角色 SET ROLE write_group; -- 切换后可使用所有权限,退出切换重置角色 RESET ROLE;五、pg_hba.conf 访问控制配置详解(连接权限管控)
前面讲解的是数据库内部权限,而pg_hba.conf是PG的外部访问控制白名单,控制「谁能连接、从哪连接、用什么方式连接数据库」,是远程连接失败的核心配置文件。
5.1 配置文件位置
Linux默认路径:
/var/lib/pgsql/版本号/data/pg_hba.confDocker环境:挂载目录下的data文件夹
Windows:安装目录/data/pg_hba.conf
5.2 配置语法规则
单行配置格式:数据库 用户名 客户端地址 认证方式
核心字段说明:
数据库:指定可连接的数据库名,all代表所有库
用户名:指定可连接的角色/用户,all代表所有用户
客户端地址:IP/网段,0.0.0.0/0代表所有IP
认证方式:md5(密码认证)、trust(免密)、peer(本地认证)
5.3 生产常用配置模板
# 1. 本地本机免密登录(默认配置) local all all peer # 2. 局域网所有IP密码登录(开发环境常用) host all all 192.168.0.0/16 md5 # 3. 所有外网IP密码登录(生产谨慎开启) host all all 0.0.0.0/0 md5 # 4. 指定用户、指定IP访问指定数据库(最安全生产配置) host test_db dev_user 10.0.0.0/24 md55.4 配置生效与常见问题
修改配置后必须重载生效,无需重启数据库:
-- SQL命令重载 SELECT pg_reload_conf();常见报错解决:远程连接提示 no pg_hba.conf entry,百分百是该文件未添加对应IP白名单。
六、生产权限最佳实践
1、角色分层管理:禁止直接给业务用户授权,创建只读/读写/管理员角色组,用户继承角色权限;
2、最小权限原则:普通用户不授予SUPERUSER、CREATE等高危权限,按需分配库、Schema、表权限;
3、默认开启INHERIT:业务用户默认开启继承,简化权限管理,高安全场景按需关闭;
4、严格管控pg_hba.conf:生产禁止0.0.0.0/0全局放行,仅开放业务服务器IP网段;
5、定期清理权限:及时回收离职人员账号、废弃角色权限,避免权限冗余。
七、配套代码GitHub开源地址
本文所有实战SQL脚本、pg_hba.conf配置模板、权限测试案例已上传GitHub,可直接下载复用:
GitHub仓库地址:(可自行替换个人仓库地址)
包含内容:
用户、角色批量创建脚本
三级权限授权/撤销完整脚本
角色继承多级嵌套实战案例
生产级pg_hba.conf配置文件
总结
1、PG中User是带LOGIN属性的Role,角色用于权限归集,用户用于实际登录;
2、权限分为库级、Schema级、对象级三级,独立授权,缺一不可;
3、GRANT/REVOKE管控权限与角色归属,INHERIT属性决定权限是否自动继承;
4、pg_hba.conf控制外部连接权限,是远程连接报错的核心排查点;
5、生产优先使用角色继承管理权限,实现批量、统一、安全的权限管控。