使用存储过程创建新数据库用户后出现身份验证错误



我在postgres中遇到了这个问题,我找不到出路。

为了让我们的关键用户在我们的postgres数据库(Ubuntu 18.04.6 LTS(GNU/Linux 5.4.0-10074-azure x86_64((中创建用户帐户,我创建了一个存储过程,用于创建一个带有密码的用户。

这是存储过程的代码:

CREATE OR REPLACE PROCEDURE geodata_create_user(
username CHARACTER VARYING,
password CHARACTER VARYING
)
LANGUAGE PLPGSQL SECURITY DEFINER
AS 
$$
DECLARE
user_to_create CHARACTER VARYING;
BEGIN
-- Check name and create user
IF (username like 'user%') THEN
user_to_create := username;
ELSE
user_to_create := 'user_' || username;
END IF;
PERFORM create_role_if_not_exists (user_to_create);
-- Set password and assign geodata_user role to user
EXECUTE format('ALTER ROLE %I WITH LOGIN PASSWORD ''%I''', user_to_create, password);
EXECUTE format('GRANT another_role TO %I', user_to_create);
end;
$$;
GRANT ALL ON PROCEDURE geodata_create_user TO some_group_role;

如果我测试它(我们有一个dev集群和一个acc/prod集群(,它可以正常工作。

问题是,如果其中一个关键用户使用此过程创建了新用户,则创建的用户无法使用提供的密码登录。

以下在pgAdmin和终端中的建议:FATAL:用户使用对等登录登录的密码身份验证失败,我尝试使用psql-U newuser命令登录psql,它告诉我FATAL:对用户的对等身份验证失败

然后,在psql中提出以下建议:FATAL:用户的对等身份验证失败;dev";使用psql-U newuser-d mydbname-h 12.345.678.910登录psql,它会回复(在输入为用户创建的密码后(:

用户newuser的密码:psql:错误:连接到"处的服务器;12.345.678.910〃;,端口8765失败:无法启动GSSAPI安全上下文:未指定的GSS失败。次要代码可能提供更多信息:Server postgres/12.345.678.910@CFSERVICES.COM在Kerberos数据库中找不到连接到服务器";12.345.678.910〃;,端口8765失败:FATAL:用户"的密码验证失败;新用户";连接到服务器";12.345.678.910〃;,端口8765失败:FATAL:没有主机"的pg_hba.conf条目;12.345.678.910〃;,用户";newuser";,数据库";mydbname";,SSL关闭

我确实有一些数据库方面的经验,但是,这类东西是我无法胜任的。有人知道这里出了什么问题吗?我的剧本有明显的错误吗?或者这可能是一个安全问题(当我们直接通过psql访问数据库服务器时,我们使用证书来访问数据库服务器,但通常我们使用DBeaver建立到数据库的连接,而不需要使用SSL或SSH隧道或证书等(。

希望有人能帮我。问候,赫尔莫埃。

您的format((函数是错误的,因为密码不是SQL标识符(这就是%I的含义(。这将导致它被错误地转义,至少在某些情况下是这样。例如,如果密码中有空格或破折号(或其他我不知道的字符(,这将导致整个密码被文字双引号包围。然后密码会起作用,但您需要指定双引号,这肯定不是您所期望的。

所以它应该是这样的,使用%L而不是%I:

EXECUTE format('ALTER ROLE %I WITH LOGIN PASSWORD %L', user_to_create, password);

你的原始代码适用于没有任何特殊符号的密码,所以这可能就是它测试良好的原因。

最新更新