PostgreSQL “password authentication failed for user” hatası, sunucunun bağlantı sırasında gönderilen kullanıcı adı ve parolayı kabul etmediğini gösterir. Sorun yalnızca parolanın yanlış yazılmasından kaynaklanmayabilir; yanlış PostgreSQL rolü, farklı bir veritabanı, beklenmeyen sunucu adresi veya uygulamanın psql komutundan farklı bağlantı ayarları da incelenmelidir.
İlk teşhis için psql ile uygulamanın gerçekten aynı bağlantı bilgilerini kullandığını karşılaştır. PostgreSQL rolü ile işletim sistemi hesabı da ayrı kimliklerdir. Örneğin bilgisayardaki ogrenci adlı Linux hesabı ile PostgreSQL içindeki app_user rolü aynı ada sahip olmak zorunda değildir. Yerel bağlantılarda seçilen kimlik doğrulama yöntemine göre işletim sistemi hesabı dikkate alınabilir, ancak bu iki hesabın otomatik olarak aynı olduğu anlamına gelmez.
Hata mesajı neden çıkar ve hangi bilgileri kontrol etmelisin?
Hata mesajını incelemeye, uygulamanın hangi PostgreSQL sunucusuna hangi rol ile bağlanmaya çalıştığını belirleyerek başla. Aşağıdaki bilgilerden biri psql ile uygulama arasında farklıysa, doğru parolayı kullandığını düşünsen bile bağlantı başarısız olabilir.
| Bilgi | Kontrol edilecek nokta |
|---|---|
| Host | Sunucu adresi veya yerel bağlantı tercihi aynı mı? |
| Port | psql ve uygulama aynı PostgreSQL portuna mı bağlanıyor? |
| Database | Bağlantıda kullanılan veritabanı adı aynı mı? |
| User | Her iki tarafta da aynı PostgreSQL rolü mü kullanılıyor? |
| Parola kaynağı | Elle girilen parola ile ortam değişkeni, yapılandırma dosyası veya parola deposundaki değer aynı mı? |
Karşılaştırmayı adım adım yapmak için önce uygulamanın bağlantı ayarlarını aç ve host, port, database ile user değerlerini not al. Ardından aynı değerleri psql komutunda kullanarak bağlantıyı dene. psql bağlantısı başarılı, uygulama bağlantısı başarısızsa sorun çoğunlukla uygulamanın okuduğu parola kaynağında, değişken adında veya bağlantı dizesindedir. İki bağlantı da başarısızsa rolün parolası ve sunucunun bağlantı kimlik doğrulama kuralları birlikte incelenmelidir.
Yetkili kullanıcıyla PostgreSQL parolası nasıl yenilenir?

Parola yenilemek için önce hedef rol üzerinde gerekli yetkiye sahip başka bir PostgreSQL rolüyle psql bağlantısı kurmalısın. Bu bağlantıda kullanılan host, veritabanı ve yetkili kullanıcı bilgileri, parola değişikliğini yapacağın PostgreSQL sunucusuna ait olmalıdır.
psql -h HOST_ADRESI -p PORT -U YETKILI_ROL -d VERITABANI
Bağlandıktan sonra hatayı oluşturan hedef rol ile aynı bağlantı bilgilerini kullanarak sorunu yeniden üretebilirsin:
psql -h HOST_ADRESI -p PORT -U app_user -d VERITABANI
Parola değiştirmek için psql içindeki password komutunu kullanmak, parolayı doğrudan SQL komutuna yazmaktan daha güvenlidir. Parola istemi etkileşimli olarak açılır ve gerçek parola komut satırında görünmez.
password app_user
Alternatif olarak ALTER USER komutu kullanılabilir. Aşağıdaki değer gerçek parola değildir, yalnızca yer tutucudur:
ALTER USER app_user WITH PASSWORD 'YENI_PAROLA_YER_TUTUCUSU';
ALTER USER, PostgreSQL’de rol özelliklerini değiştirmek için kullanılan komutlardan biridir ve parola sözdizimi PostgreSQL’in güncel ALTER ROLE belgelerinde açıklanır. Sıradan bir rol kendi parolasını değiştirebilir. Başka bir rolün parolasını değiştirmek için oturum açılan rolün uygun yönetim yetkilerine sahip olması gerekir.
Değişiklikten sonra bağlantıyı aynı host, port, veritabanı ve kullanıcı bilgileriyle yeniden dene:
psql -h HOST_ADRESI -p PORT -U app_user -d VERITABANI
Bu deneme başarılı olduğu hâlde uygulama hâlâ hata veriyorsa, uygulamanın parola kaynağını ve bağlantı ayarlarını psql komutuyla satır satır karşılaştır.
pg_hba.conf kimlik doğrulamasını nasıl belirler?

pg_hba.conf, bağlantının türüne, istemci adresine, hedef veritabanına ve PostgreSQL kullanıcı adına göre uygulanacak kimlik doğrulama kuralını belirler. Seçilen kuraldaki yöntem, sunucunun bağlantı isteğinde bulunan kullanıcının kimliğini nasıl kontrol edeceğini söyler.
Kurallar sırayla değerlendirilir ve bağlantıyla eşleşen ilk kural kullanılır. Bu kuralla doğrulama başarısız olursa sonraki satırlar denenmez. Bu nedenle daha yukarıdaki geniş kapsamlı bir kural, uygulamak istediğin satırdan önce eşleşerek hatanın nedenini bulmanı zorlaştırabilir.
Dosyanın konumu kuruluma göre değişebilir. Sunucuya erişebildiğin bir oturumda aşağıdaki SQL komutuyla etkin dosyanın yolunu öğrenebilirsin:
SHOW hba_file;
Komut, sunucunun kimlik doğrulama kuralları için kullandığı dosyanın yolunu döndürür. Dosyayı düzenlemeden önce bağlantı kurmaya çalıştığın sunucuya ait olduğundan emin ol.
- peer: Yerel bağlantılarda işletim sistemi kullanıcısının kimliğini kullanır. Bu kimlik, istenen PostgreSQL rolüyle karşılaştırılır; gerektiğinde kullanıcı eşlemesi tanımlanabilir.
- scram-sha-256: Parola tabanlı kimlik doğrulama uygular. İstemcinin bu yöntemi desteklemesi ve rol için uygun bir parola bulunması gerekir.
- md5: Parola tabanlı doğrulama uygular. Rolün parolası SCRAM biçiminde saklanıyorsa bu kuralla da SCRAM doğrulaması kullanılabilir. Yeni yapılandırmalarda istemci uyumluluğunu değerlendirerek SCRAM tercih edebilirsin.
trust yöntemi ise eşleşen bağlantılarda parola veya başka bir kimlik doğrulaması istemez. Bu durum, ilgili kuralla sunucuya erişebilen bir kişinin belirtilen PostgreSQL kullanıcısı olarak bağlanmasına yol açabileceğinden yetkisiz erişim riski taşır; kalıcı çözüm olarak kullanılmamalıdır.
Değişiklikten sonra yapılandırma nasıl yeniden yüklenir?
pg_hba.conf değişikliklerinin sunucu tarafından okunması için çoğu işletim sisteminde yapılandırmayı yeniden yüklemek gerekir. Bu adım atlanırsa sunucu önceki kuralları kullanmaya devam edebilir. Windows'ta ise dosya değişiklikleri sonraki yeni bağlantılara doğrudan uygulanır.
Sunucuya erişebildiğin ve gerekli yetkiye sahip olduğun bir SQL oturumunda şu komutu çalıştırabilirsin:
SELECT pg_reload_conf();
Beklenen çıktı, yeniden yükleme isteğinin gönderildiğini gösteren true değeridir. Bu değer, dosyadaki bütün kuralların hatasız uygulandığını tek başına doğrulamaz.
Alternatif olarak sunucunun yönetim aracı, işletim sistemi hizmetinin yeniden yükleme seçeneği veya pg_ctl reload kullanılabilir. Uygun işlem kurulumuna ve yetkilerine bağlıdır; bu değişiklik için sunucuyu tamamen yeniden başlatmak genellikle gerekmez.
Değişiklikten sonra şu kontrolleri yap:
- Aynı sunucu, port, veritabanı ve kullanıcı bilgileriyle yeni bir bağlantı dene.
- Hata sürüyorsa kuralların sırasını ve sunucu kayıtlarını incele. Yetkili bir oturumda
pg_hba_file_rulesgörünümündekierroralanı, dosyadaki hatalı satırları bulmana yardımcı olabilir. Bu görünüm, son yüklenen kuralları değil, dosyanın mevcut içeriğini gösterir. - Geçici bir
trustkuralı kullanıldıysa kaldır ve uygun kimlik doğrulama yöntemine dön. Kuralın kullanıcı, veritabanı ve adres kapsamını gerekli bağlantılarla sınırla; ardından yapılandırmayı yeniden yükle ve tekrar bağlantı testi yap.
Python psycopg2 bağlantısı nasıl düzeltilir?
Python uygulaması password authentication failed for user hatası veriyorsa önce uygulamanın kullandığı sunucu adresini, portu, veritabanını ve PostgreSQL kullanıcısını kontrol et. Ardından aynı bilgilerle psql üzerinden bağlanmayı dene; böylece uygulama ayarlarını parola sorunundan ayırabilirsin.
Bağlantı bilgileri bulunduğun terminal ortamında PGHOST, PGPORT, PGDATABASE ve PGUSER değişkenleri olarak tanımlıysa aşağıdaki komutla parola istemini açabilirsin:
psql -W
İstenen parolayı girerek bağlantıyı dene. Bağlantı başarısız olursa yetkili bir PostgreSQL kullanıcısıyla oturum açıp ilgili rolün parolasını password rol_adi komutuyla yenileyebilirsin. rol_adi yerine uygulamanın kullandığı PostgreSQL rolünü yaz; yeni parolayı komut satırına eklemek yerine açılan isteme gir.
Parolayı yeniledikten sonra aynı sunucu, port, veritabanı ve kullanıcıyla psql -W komutunu yeniden dene. Bağlantı başarılıysa uygulamanın çalıştığı ortamda PGPASSWORD değerini yeni parolayla güncelle ve uygulamayı yeniden çalıştır.
Aşağıdaki örnek, bağlantı bilgilerini ortam değişkenlerinden okur. psycopg2.connect() bu değerleri host, port, dbname, user ve password parametreleriyle alır.
import os
import psycopg2
connection = psycopg2.connect(
host=os.environ["PGHOST"],
port=os.environ["PGPORT"],
dbname=os.environ["PGDATABASE"],
user=os.environ["PGUSER"],
password=os.environ["PGPASSWORD"],
)
connection.close()
print("Bağlantı başarılı.")
Kodun çalışması için psycopg2 kurulu ve beş ortam değişkeni de uygulamanın çalıştığı ortamda tanımlı olmalıdır. Bağlantı kurulup kapatıldığında beklenen çıktı şöyledir:
Bağlantı başarılı.
psql başarılı olduğu hâlde uygulama hata veriyorsa uygulamanın farklı ortam değişkenleri, eski bir parola, farklı bir kullanıcı veya veritabanı okuyup okumadığını kontrol et. Sunucu adresi ve portun da testte kullanılan değerlerle aynı olduğundan emin ol; parolayı kontrol ederken ekrana ya da uygulama kayıtlarına yazdırma.
Sık Sorulan Sorular
İşletim sistemi kullanıcısı ile PostgreSQL kullanıcısı aynı olmak zorunda mı?
İşletim sistemi kullanıcısı ile PostgreSQL kullanıcısının adı aynı olmak zorunda değildir; bunlar ayrı kimliklerdir. Bununla birlikte peer gibi yerel bağlantılarda kullanılan yöntemlerde işletim sistemi kimliği doğrulama sürecine katılır.
pg_hba.conf dosyasını değiştirdikten sonra PostgreSQL sunucusunu yeniden başlatmak gerekir mi?
Genellikle sunucuyu yeniden başlatmak gerekmez; değişikliği uygulamak için yapılandırmayı yeniden yüklemek yeterlidir. Windows üzerinde pg_hba.conf değişiklikleri sonraki yeni bağlantılara uygulanır.
psql ile bağlanabildiğim hâlde Python uygulamam neden password authentication failed for user hatası alır?
Python uygulaması psql testinden farklı bir sunucuya veya kullanıcıya bağlanıyor ya da eski bir parola kullanıyor olabilir. Uygulamanın çalıştığı ortamdaki bağlantı değerlerini, parolayı göstermeden testte kullandıklarınla karşılaştır.
trust kimlik doğrulama yöntemini geçici olarak kullanmak güvenli mi?
trust yöntemi geçici kullanımda da risk taşır; eşleşen bağlantılarda parola doğrulaması yapılmadığı için erişebilen biri izin verilen bir PostgreSQL kullanıcı adıyla oturum açabilir. Kalıcı çözüm olarak kullanma ve erişim sınırlarını dikkatle değerlendir.
Bağlantı bilgilerini aynı koşullarda karşılaştırmak, parolanın mı yoksa uygulama yapılandırmasının mı düzeltilmesi gerektiğini belirlemene yardımcı olur.