psql: FATAL: Otentikasi rekan gagal untuk pengguna "dev"

198

ketika saya membuat pengguna baru, tetapi tidak bisa masuk ke database.
Saya melakukan itu seperti ini:

postgres@Aspire:/home/XXX$ createuser dev
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

lalu buat database:

postgres@Aspire:/home/XXX$ createdb -O dev test_development

setelah itu, saya mencoba psql -U dev -W test_developmentlogin, tetapi mendapatkan error:

psql: FATAL:  Peer authentication failed for user "dev"

Saya mencoba menyelesaikan masalah tetapi gagal.

hsming
sumber
2
kemungkinan duplikat autentikasi PG Peer gagal
Daniel Vérité
sekarang, untuk dimintai jawaban atas pertanyaan di atas, Anda perlu menambahkan --interactiveperintah:createuser --interactive joe
user3791372

Jawaban:

310

Mencoba:

psql -U user_name  -h 127.0.0.1 -d db_name

dimana

  • -U adalah nama pengguna basis data
  • -h adalah nama host / IP server lokal, sehingga menghindari soket domain Unix
  • -d adalah nama basis data untuk terhubung

Ini kemudian dievaluasi sebagai koneksi "jaringan" oleh Postgresql daripada koneksi soket domain Unix, sehingga tidak dievaluasi sebagai koneksi "lokal" seperti yang Anda lihat di pg_hba.conf:

local   all             all                                     peer
meyerson
sumber
15
Saya membutuhkan (ver 9.4): psql -U-nama pengguna -h 127.0.0.1 -d db-name
Gregor
9
apa alat ornery. manual mengatakan psql [option...] [dbname [username]], jadi Anda akan berpikir psql dbname usernamehanya akan berhasil ..
djeikyb
2
Bekerja untuk saya juga. Saya juga berpikir ini adalah cara yang jauh lebih disukai daripada mengubah file konfigurasi, terutama ketika Anda tidak memiliki petunjuk tentang apa yang Anda lakukan dan hanya mengikuti SO jawaban untuk menyelesaikan masalah Anda.
borisano
1
ini bekerja untuk saya, terima kasih banyak, meskipun saya sedang melakukan penelitian tentang mengapa itu adalah solusi yang tepat. namun demikian, dalam konfigurasi di komputer lain saya akan login sebagai basis data psql -U username -d. jadi saya kira solusi yang diterima tergantung pada kasingnya.
Lazarus Meningkat
2
Jawaban yang bagus. Saya mendapatkan dari dalam database setelah login sebagai postgres \c glossary john FATAL: Peer authentication failed for user "john"kemudian dengan \c glossary john localhost Password for user john: SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) You are now connected to database "glossary" as user "john" on host "localhost" at port "5432".itu berhasil.
lihat
215

Koneksi Anda gagal karena secara default psqlmenghubungkan melalui soket UNIX menggunakan peerotentikasi, yang mengharuskan pengguna UNIX saat ini memiliki nama pengguna yang sama psql. Jadi, Anda harus membuat pengguna UNIX devdan kemudian login sebagai devatau gunakan sudo -u dev psql test_developmentuntuk mengakses database (dan tidakpsql harus meminta kata sandi).

Jika Anda tidak dapat atau tidak ingin membuat pengguna UNIX, seperti jika Anda hanya ingin terhubung ke database Anda untuk permintaan ad hoc , memaksa koneksi soket menggunakan psql --host=localhost --dbname=test_development --username=dev(seperti yang ditunjukkan oleh @meyerson jawaban) akan menyelesaikan masalah langsung Anda.

Tetapi jika Anda bermaksud memaksakan otentikasi kata sandi pada soket Unix alih-alih metode peer, coba ubah pg_hba.confbaris * berikut ini :

dari

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

untuk

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peerberarti akan mempercayai identitas (keaslian) pengguna UNIX. Jadi tidak meminta kata sandi.

  • md5berarti akan selalu meminta kata sandi, dan memvalidasi setelah hashing dengan MD5.

Anda dapat, tentu saja, juga membuat aturan yang lebih spesifik untuk basis data atau pengguna tertentu, dengan beberapa pengguna memiliki peerdan lainnya memerlukan kata sandi.

Setelah mengubah pg_hba.confjika PostgreSQL berjalan, Anda harus membuatnya membaca ulang konfigurasi dengan memuat ulang ( pg_ctl reload) atau memulai ulang ( sudo service postgresql restart).

* File pg_hba.confkemungkinan besar akan berada di/etc/postgresql/9.x/main/pg_hba.conf

Diedit: Komentar dari @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_What komentar dimasukkan ke dalam jawaban.

flaviodesousa
sumber
5
Bagaimana Anda mengizinkan peer DAN md5 ? Ketika saya atur md5, maka saya tidak bisa lagi login dengan postgrespengguna! Saya mencoba menambahkan beberapa baris, dan memisahkan metode dengan koma, tetapi mereka tidak berhasil. Ok saya menemukan mgoldwasserjawaban dan itu berhasil. Saya baru saja menambahkan baris lain untuk pengguna postgresdengan metode peer!
Chloe
3
Jangan khawatir, Anda dapat mengatur otentikasi rekan untuk pengguna tertentu (misalnya, nama pengguna atau postgres Anda). Tampaknya aturan khusus mengesampingkan aturan umum
JavierIEH
1
Pada beberapa distribusi file mungkin juga ditemukan di sini:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher
2
Anda tidak dapat melakukan ini tanpa me-restart postgresql? tidak bisakah Anda menentukan metode otentikasi di tabel pg_user?
fccoelho
2
Anda dapat memuat ulang alih-alih memulai ulang. Itu memuat ulang tabel pg_hba. Bekerja untukku.
Joanis
29

Otentikasi rekan berarti bahwa postgres meminta sistem operasi untuk nama login Anda dan menggunakannya untuk otentikasi. Untuk masuk sebagai pengguna "dev" menggunakan otentikasi rekan pada postgres, Anda juga harus menjadi pengguna "dev" di sistem operasi.

Anda dapat menemukan detail metode otentikasi dalam dokumentasi Postgresql .

Petunjuk: Jika tidak ada metode otentikasi yang berfungsi lagi, putuskan sambungan server dari jaringan dan gunakan metode "trust" untuk "localhost" (dan periksa kembali apakah server Anda tidak dapat dijangkau melalui jaringan saat metode "trust" diaktifkan).

stefan.schwetschke
sumber
1
terima kasih atas jawaban Anda. tetapi masih tidak berfungsi jika saya mengubah devpengguna sistemXXX
hsming
2
Jawaban Stefan benar. Saya baru saja menambahkan tautan, yang akan terlihat ketika edit saya ditinjau, ke dokumentasi di mana masing-masing metode otentikasi dijelaskan.
dsh
25

Ketika Anda menentukan:

psql -U user

itu terhubung melalui UNIX Socket, yang secara default menggunakan peerotentikasi, kecuali ditentukan pg_hba.conflain.

Anda dapat menentukan:

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

untuk mendapatkan koneksi TCP / IP pada antarmuka loopback (baik IPv4 dan IPv6) untuk yang ditentukan databasedan user.

Setelah perubahan, Anda harus memulai ulang postgres atau memuat ulang konfigurasinya. Mulai ulang yang seharusnya berfungsi di distro modern berbasis RHEL / Debian:

service postgresql restart

Muat ulang harus bekerja dengan cara berikut:

pg_ctl reload

tetapi perintah mungkin berbeda tergantung dari konfigurasi PATH - Anda mungkin harus menentukan path absolut, yang mungkin berbeda, tergantung pada cara postgres diinstal.

Maka Anda dapat menggunakan:

psql -h localhost -U user -d database

untuk login dengan yang userditentukan databasemelalui TCP / IP. md5singkatan kata sandi terenkripsi, sementara Anda juga dapat menentukan passwordkata sandi teks biasa selama otorisasi. 2 pilihan ini seharusnya tidak menjadi masalah besar selama server database hanya dapat diakses secara lokal, tanpa akses jaringan.

Catatan penting: Urutan definisi dalam pg_hba.confmasalah - aturan dibaca dari atas ke bawah, seperti iptables, jadi Anda mungkin ingin menambahkan aturan yang diusulkan di atas aturan:

host    all             all             127.0.0.1/32            ident
tymik
sumber
ulang Catatan penting: - urutan penting +1
hawkeye
23

Sementara jawaban @ flaviodesousa akan berfungsi, itu juga membuatnya wajib bagi semua pengguna (semua orang) untuk memasukkan kata sandi.

Kadang masuk akal untuk menjaga otentikasi rekan untuk orang lain, tetapi buat pengecualian untuk pengguna layanan. Dalam hal ini Anda ingin menambahkan baris ke pg_hba.conf yang terlihat seperti:

local   all             some_batch_user                         md5

Saya akan merekomendasikan agar Anda menambahkan baris ini tepat di bawah baris tajuk komentar:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

Anda perlu me-restart menggunakan PostgreSQL

sudo service postgresql restart

Jika Anda menggunakan 9.3, pg_hba.conf Anda kemungkinan besar adalah:

/etc/postgresql/9.3/main/pg_hba.conf

mgoldwasser
sumber
12

Ini bekerja untuk saya ketika saya menabraknya:

sudo -u username psql
alangrah
sumber
hanya berfungsi jika Anda membuat pengguna yang sama sekali baru di sistem DAN di postgres - hsming hanya ingin terhubung ke postgres dengan pengguna postgres yang baru dibuat dev,.
Kenneth
8

Solusi termudah:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;
Abel
sumber
6

Saya hanya perlu menambahkan -h localhost

VPaul
sumber
Masalah saya menggunakan postgres di Raspberry. ^^^ bekerja untuk saya !! Terima kasih!
tidydee
2

Dalam kasus saya, saya menggunakan port yang berbeda. Defaultnya adalah 5432. Saya menggunakan 5433. Ini berfungsi untuk saya:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433
Ikrom
sumber
Ini dapat terjadi secara otomatis ketika Anda memiliki lebih dari satu instalasi postgres.
Galigator
1

Bagi orang-orang di masa depan melihat ini, postgresada di /usr/lib/postgresql/10/binserver Ubuntu saya.

Saya menambahkannya ke PATH di file .bashrc saya, dan tambahkan baris ini di akhir

PATH=$PATH:/usr/lib/postgresql/10/bin

kemudian pada baris perintah

$> source ./.bashrc

Saya menyegarkan kembali lingkungan bash saya. Sekarang saya dapat menggunakan postgres -D /whereverdari direktori mana pun

Tyler Curtis Jowers
sumber
1

pg_dump -h localhost -U postgres -F c -b -v -f mydb.backup mydb

Dmitry Shilin
sumber
Pertanyaan apa yang dijawab oleh pertanyaan ini? Mengapa mungkin -U postgressangat penting? Apa semua orang lari-surat , sih?
greybeard
0

Mencoba:

psql -U role_name -d database -h hostname..com -W

Srinu Mareti
sumber
Harap tambahkan sedikit lebih banyak konteks untuk jawaban Anda.
Death Waltz