AI建议

对于Web API系统,建议使用密码认证(md5或scram-sha-256)而不是peer认证,因为:

配置更简单 - 无需复杂的用户名映射
更灵活 - 支持远程连接和容器化部署
更适合API场景 - Web API通常不需要peer认证提供的操作系统级别的身份验证
peer认证更适合于系统管理员直接访问数据库的场景,而不是Web API应用程序。

但是我就想试一下peer认证方式的可行性。结果跟AI聊了半天才解决了这个问题,下面记录一下步骤:

  1. 首先保证用table plus等数据库管理软件能够登录正常(这个是之前就配置好的,所有没有记录)
  2. 修个数据库的 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 的用户名映射
  1. 用户名映射配置 相应地,您需要在 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>;