用户与权限管理
掌握角色与用户的创建管理
理解权限体系与授权回收
能设计合理的权限方案
核心讲解
(1)角色与用户
PG 里角色是权限的集合,用户也是角色,可以登录的角色就是用户。
登录角色:有 LOGIN 属性,可以登录
普通角色:权限分组,不登录,授权给用户
(2)常用角色属性
LOGIN:允许登录SUPERUSER:超级用户,最高权限CREATEDB:允许建库CREATEROLE:允许创建角色PASSWORD '密码':设置密码VALID UNTIL '时间':密码过期时间
(3)权限体系
权限层级:实例 → 数据库 → 模式 → 表 → 列
权限类型:SELECT、INSERT、UPDATE、DELETE、CREATE、USAGE 等
授权:
GRANT 权限 ON 对象 TO 角色;回收:
REVOKE 权限 ON 对象 FROM 角色;
(4)最佳实践
最小权限原则,只给需要的权限
用角色分组管理权限,不要直接给用户授权
业务用户只给 DML 权限,不给 DDL
超级用户只做管理用,业务不用
代码示例
-- ===== 1. 创建用户 =====
-- 创建普通用户,能登录,能建库
CREATE USER dev_user
WITH PASSWORD '123456'
CREATEDB;
-- 创建只读角色
CREATE ROLE read_only;
-- ===== 2. 授权 =====
-- 给只读角色授权查询所有表
GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only;
-- 把角色授权给用户
GRANT read_only TO dev_user;
-- 给用户授权插入更新
GRANT INSERT, UPDATE ON student TO dev_user;
-- 授予模式使用权限
GRANT USAGE ON SCHEMA public TO dev_user;
-- ===== 3. 回收权限 =====
REVOKE UPDATE ON student FROM dev_user;
-- ===== 4. 修改/删除 =====
-- 修改密码
ALTER USER dev_user WITH PASSWORD '654321';
-- 删除角色
DROP ROLE read_only;
-- ===== 5. 查看权限 =====
-- 查看当前用户权限
\du
-- 查看表权限
\dp student
常见误区
用超级用户跑业务:业务程序绝对不能用 postgres 超级用户,风险极大
权限直接给用户:用户多人的时候,用角色管理更方便,调整角色就行
只给表权限不给模式:必须先给模式 USAGE 权限,不然看不到表
PUBLIC 权限不注意:默认 PUBLIC 有很多权限,安全加固要回收
课后练习
创建一个开发用户,设置密码
创建一个只读角色,授权查询所有表
把只读角色授权给开发用户
思考:为什么生产环境要最小权限原则?

