AI建议
对于Web API系统,建议使用密码认证(md5或scram-sha-256)而不是peer认证,因为:
配置更简单 - 无需复杂的用户名映射
更灵活 - 支持远程连接和容器化部署
更适合API场景 - Web API通常不需要peer认证提供的操作系统级别的身份验证
peer认证更适合于系统管理员直接访问数据库的场景,而不是Web API应用程序。
但是我就想试一下peer认证方式的可行性。结果跟AI聊了半天才解决了这个问题,下面记录一下步骤:
- 首先保证用table plus等数据库管理软件能够登录正常(这个是之前就配置好的,所有没有记录)
- 修个数据库的 pg_hba.conf 文件,在 pg_hba.conf 文件中,对于 local 连接类型(Unix domain socket),您需要在认证方法后面添加 map=your_map_name 选项。 client-auth.sgml:150
正确的配置格式
local database user peer map=your_map_name
这里:
local 表示使用 Unix domain socket 连接 client-auth.sgml:172-174
all 表示所有数据库
all 表示所有用户
peer 是认证方法
map=mypeermap 指定使用名为 mypeermap 的用户名映射
- 用户名映射配置 相应地,您需要在 pg_ident.conf 文件中定义这个映射:
# MAPNAME SYSTEM-USERNAME DATABASE-USERNAME
mypeermap your_system_user your_db_user
当我运行migrate时报错 您遇到的是PostgreSQL schema权限问题。当使用peer认证时,您的API用户缺少对public schema的必要权限来执行migration操作 这个错误表明您的数据库用户(通过peer认证映射的用户)没有在public schema中创建对象的权限。 在PostgreSQL 15及更高版本中,默认情况下已经撤销了public schema的CREATE权限,这是为了提高安全性。
调试步骤
确认当前连接用户:
SELECT current_user, session_user, system_user;
检查该用户的schema权限:
SELECT has_schema_privilege(current_user, 'public', 'CREATE');
SELECT has_schema_privilege(current_user, 'public', 'USAGE');
如果权限检查返回false,为实际用户授权:
GRANT CREATE ON SCHEMA public TO <actual_user>;
GRANT USAGE ON SCHEMA public TO <actual_user>;