用户权限管理 #

一、用户管理 #

1.1 创建用户 #

sql
-- 创建用户
CREATE USER readonly WITH PASSWORD 'password123';

-- 创建管理员用户
CREATE USER admin WITH PASSWORD 'admin123';

-- 创建带选项的用户
CREATE USER app_user 
    WITH PASSWORD 'app123'
    LOGIN
    CREATEDB;

-- 查看所有用户
SELECT * FROM pg_catalog.pg_user;
SHOW USERS;

1.2 修改用户 #

sql
-- 修改密码
ALTER USER readonly WITH PASSWORD 'newpassword';

-- 重命名用户
ALTER USER readonly RENAME TO read_user;

-- 禁用登录
ALTER USER readonly NOLOGIN;

-- 启用登录
ALTER USER readonly LOGIN;

-- 授予创建数据库权限
ALTER USER app_user CREATEDB;

-- 授予创建用户权限
ALTER USER admin CREATEROLE;

1.3 删除用户 #

sql
-- 删除用户
DROP USER readonly;

-- 如果用户拥有对象,需要先转移或删除
DROP USER IF EXISTS readonly;

二、角色管理 #

2.1 创建角色 #

sql
-- 创建角色
CREATE ROLE readonly_role;

-- 创建带权限的角色
CREATE ROLE app_role WITH LOGIN PASSWORD 'role123';

-- 角色与用户的区别:
-- - 用户: 可以登录
-- - 角色: 不能登录 (除非指定 LOGIN)

-- 查看所有角色
SHOW ROLES;
SELECT * FROM pg_catalog.pg_roles;

2.2 角色授权 #

sql
-- 将角色授予用户
GRANT readonly_role TO readonly_user;

-- 将角色授予另一个角色
GRANT readonly_role TO app_role;

-- 撤销角色
REVOKE readonly_role FROM readonly_user;

-- 查看用户角色
SELECT 
    r.rolname AS role,
    m.rolname AS member
FROM pg_catalog.pg_roles r
JOIN pg_catalog.pg_auth_members am ON r.oid = am.roleid
JOIN pg_catalog.pg_roles m ON am.member = m.oid;

2.3 预定义角色 #

text
预定义角色
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   admin: 完全管理权限                                       │
│                                                             │
│   root: 超级用户,拥有所有权限                              │
│                                                             │
│   public: 所有用户默认属于此角色                            │
│                                                             │
│   常用权限组合:                                             │
│   ├── readonly: 只读权限                                   │
│   ├── readwrite: 读写权限                                  │
│   └── admin: 管理权限                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

三、权限类型 #

3.1 权限列表 #

权限 说明
ALL 所有权限
SELECT 查询权限
INSERT 插入权限
UPDATE 更新权限
DELETE 删除权限
CREATE 创建对象权限
DROP 删除对象权限
GRANT 授权权限
CONNECT 连接权限

3.2 权限范围 #

sql
-- 数据库级别权限
GRANT ALL ON DATABASE mydb TO app_user;
GRANT CONNECT ON DATABASE mydb TO readonly_user;

-- Schema级别权限
GRANT ALL ON SCHEMA public TO app_user;
GRANT USAGE ON SCHEMA public TO readonly_user;

-- 表级别权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE users TO app_user;

-- 列级别权限
GRANT SELECT (id, name) ON users TO readonly_user;

-- 序列权限
GRANT USAGE, SELECT ON SEQUENCE user_id_seq TO app_user;

四、授权管理 #

4.1 授予权限 #

sql
-- 授予数据库权限
GRANT ALL ON DATABASE mydb TO admin_user;
GRANT CONNECT ON DATABASE mydb TO readonly_user;

-- 授予表权限
GRANT SELECT ON users TO readonly_user;
GRANT SELECT, INSERT, UPDATE ON users TO app_user;
GRANT ALL ON users TO admin_user;

-- 授予多个表权限
GRANT SELECT ON users, orders, products TO readonly_user;

-- 授予Schema下所有表权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;

-- 授予所有权限
GRANT ALL ON ALL TABLES IN SCHEMA public TO admin_user;

-- 允许用户授权给其他人
GRANT SELECT ON users TO app_user WITH GRANT OPTION;

4.2 撤销权限 #

sql
-- 撤销表权限
REVOKE SELECT ON users FROM readonly_user;
REVOKE ALL ON users FROM app_user;

-- 撤销数据库权限
REVOKE ALL ON DATABASE mydb FROM readonly_user;

-- 撤销Schema下所有表权限
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM readonly_user;

-- 撤销授权选项
REVOKE GRANT OPTION FOR SELECT ON users FROM app_user;

4.3 查看权限 #

sql
-- 查看表权限
SHOW GRANTS ON TABLE users;

-- 查看数据库权限
SHOW GRANTS ON DATABASE mydb;

-- 查看用户权限
SELECT 
    grantee,
    table_schema,
    table_name,
    privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'readonly_user';

-- 查看所有权限
SELECT * FROM information_schema.table_privileges;

五、权限最佳实践 #

5.1 最小权限原则 #

text
最小权限原则
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   1. 只授予必要的权限                                       │
│      ├── 应用用户: 只授予业务需要的权限                    │
│      ├── 只读用户: 只授予 SELECT                           │
│      └── 管理员: 授予管理权限                              │
│                                                             │
│   2. 使用角色管理权限                                       │
│      ├── 创建角色并授权                                    │
│      ├── 将角色授予用户                                    │
│      └── 便于权限管理                                      │
│                                                             │
│   3. 定期审计权限                                           │
│      ├── 检查用户权限                                      │
│      ├── 清理不必要的权限                                  │
│      └── 及时回收离职用户权限                              │
│                                                             │
│   4. 避免直接授权给用户                                     │
│      ├── 通过角色授权                                      │
│      └── 简化管理                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

5.2 角色设计示例 #

sql
-- 创建只读角色
CREATE ROLE readonly_role;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_role;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO readonly_role;

-- 创建读写角色
CREATE ROLE readwrite_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO readwrite_role;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO readwrite_role;

-- 创建管理员角色
CREATE ROLE admin_role;
GRANT ALL ON DATABASE mydb TO admin_role;
GRANT ALL ON ALL TABLES IN SCHEMA public TO admin_role;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO admin_role;

-- 将角色授予用户
GRANT readonly_role TO readonly_user;
GRANT readwrite_role TO app_user;
GRANT admin_role TO admin_user;

六、总结 #

用户权限管理要点:

特性 说明
用户管理 CREATE/ALTER/DROP USER
角色管理 CREATE/GRANT/REVOKE ROLE
权限类型 SELECT/INSERT/UPDATE/DELETE等
权限范围 数据库/Schema/表/列

下一步,让我们学习备份与恢复!

最后更新:2026-03-27