我在 postgres 中遇到了這個問題,我找不到出路。
為了讓我們的關鍵用戶在我們的 postgres 資料庫(Ubuntu 18.04.6 LTS (GNU/Linux 5.4.0-1074-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;
如果我測驗它(我們有一個開發集群和一個 acc/prod 集群),它作業正常。
問題是,如果其中一個關鍵用戶使用此程序創建了一個新用戶,則該用戶已創建但無法使用提供的密碼登錄。
以下pgAdmin 和終端中的建議:FATAL: password authentication failed for user to login using peer login, 我嘗試使用 psql -U newuser 命令登錄 psql 它告訴我 FATAL: Peer authentication failed for user
然后,在psql 中提出以下建議: FATAL: Peer authentication failed for user "dev" logging on psql using psql -U newuser -d mydbname -h 12.345.678.910 并回復(在輸入為用戶創建的密碼后):
用戶 newuser 的密碼:psql:錯誤:連接到“12.345.678.910”的服務器,埠 8765 失敗:無法啟動 GSSAPI 安全背景關系:未指定的 GSS 失敗。次要代碼可能提供更多資訊:服務器 postgres/[email protected] 在“12.345.678.910”與服務器的 Kerberos 資料庫連接中找不到,埠 8765 失敗:致命:用戶“newuser”與服務器的連接密碼驗證失敗“12.345.678.910”,埠 8765 失敗:致命:主機“12.345.678.910”,用戶“newuser”,資料庫“mydbname”沒有 pg_hba.conf 條目,SSL 關閉
我確實有一點資料庫經驗,但是,這種東西超出了我的范圍。有人知道這里出了什么問題嗎?我的腳本中有明顯的錯誤嗎?或者可能是一個安全問題(我們在通過 psql 直接訪問資料庫服務器時使用證書來訪問資料庫服務器,但通常我們使用 DBeaver 設定與資料庫的連接,而無需使用 SSL 或 SSH 隧道或證書或所以)。
希望有人可以幫助我解決這個問題。問候,赫爾莫特。
uj5u.com熱心網友回復:
您的 format() 函式是錯誤的,因為密碼不是 SQL 識別符號(這是 %I 的用途)。至少在某些情況下,這將導致它被錯誤地轉義。例如,如果密碼中有空格或破折號(或其他我不知道的字符),這將導致整個密碼被文字雙引號包圍。然后密碼就可以了,但是您需要指定雙引號,這肯定不是您所期望的。
所以它應該看起來像這樣,使用 %L 而不是 %I:
EXECUTE format('ALTER ROLE %I WITH LOGIN PASSWORD %L', user_to_create, password);
您的原始代碼適用于其中沒有任何特殊符號的密碼,所以也許這就是它測驗良好的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/460640.html
標籤:PostgreSQL 验证 密码 plpgsql 海狸
