用户管理
前言
PostgreSQL的用户管理是数据库安全的第一道防线。想象一下,如果你的数据库是一座城堡,那么用户就是进出城堡的访客。谁可以进入?谁可以查看什么?谁可以修改什么?这些问题都需要通过精细的用户管理来回答。
用户与角色
在PostgreSQL中,用户和角色本质上是相同的,区别仅在于用户默认具有登录权限。PostgreSQL采用"角色"作为权限管理的基本单位,这为权限管理提供了极大的灵活性。
PostgreSQL内置了几种预定义的角色:
superuser:超级用户,拥有所有权限readall:可以读取所有数据库writeall:可以读写所有数据库pg_read_all_files:可以读取所有文件pg_read_all_settings:可以读取所有配置参数pg_read_all_stats:可以读取所有统计信息pg_monitor:可以监控服务器pg_signal_backend:可以终止后端进程
创建用户
创建用户是用户管理的起点。在PostgreSQL中,创建用户的基本语法如下:
CREATE USER username [ WITH ] option [ ... ]
其中,常见的选项包括:
PASSWORD 'password':设置 用户密码SUPERUSER | NOSUPERUSER:是否为超级用户CREATEDB | NOCREATEDB:是否可以创建数据库CREATEROLE | NOCREATEROLE:是否可以创建角色INHERIT | NOINHERIT:是否继承父角色的权限LOGIN | NOLOGIN:是否可以登录REPLICATION | NOREPLICATION:是否可以进行复制CONNECTION LIMIT connlimit:连接数限制VALIDATE PASSWORD password:密码验证策略
例如,创建一个具有创建数据库权限的用户:
CREATE analyst WITH PASSWORD 'securePassword123' CREATEDB LOGIN;
删除用户
当不再需要某个用户时,应该及时删除以减少安全风险。删除用户的语法很简单:
DROP USER username;
但需要注意的是,删除用户前应确保该用户没有拥有任何数据库对象,否则删除操作会失败。如果需要强制删除用户及其拥有的所有对象,可以使用:
DROP USER username CASCADE;
管理用户密码
密码是用户认证的第一道防线。PostgreSQL提供了多种密码管理方式:
设置密码
ALTER USER username WITH PASSWORD 'newPassword';
强制用户在下次连接时修改密码
ALTER USER username PASSWORD '';
设 置密码过期策略
ALTER USER username VALID UNTIL 'timestamp';
-- 例如:
ALTER USER analyst VALID UNTIL '2023-12-31';
检查密码过期策略
SELECT usename, usecreatedb, userepl, valuntil
FROM pg_shadow
WHERE usename = 'username';
管理角色
角色是PostgreSQL权限管理的核心。通过角色,可以实现权限的集中管理和继承。
创建角色
CREATE ROLE rolename [ WITH ] option [ ... ]
角色与用户的区别在于,角色默认没有登录权限。
为用户分配角色
GRANT rolename TO username;
撤销角色分配
REVOKE rolename FROM username;
删除角色
DROP ROLE rolename;
查看用户和角色
了解数据库中的用户和角色是管理的基础。PostgreSQL提供了多种系统视图来查询这些信息:
查看所有用户
-- 查看所有用户(包括角色)
SELECT usename, usecreatedb, usesuper, usecatupd, valuntil
FROM pg_user;