psql: FATAL: การรับรองความถูกต้องแบบเพียร์ล้มเหลวสำหรับผู้ใช้“ dev”


198

เมื่อฉันสร้างผู้ใช้ใหม่ แต่ไม่สามารถล็อกอินฐานข้อมูลได้
ฉันทำสิ่งนี้:

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

จากนั้นสร้างฐานข้อมูล:

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

หลังจากนั้นฉันพยายามpsql -U dev -W test_developmentเข้าสู่ระบบ แต่ได้รับข้อผิดพลาด:

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

ฉันพยายามที่จะแก้ปัญหา แต่ล้มเหลว


2
ซ้ำซ้อนที่เป็นไปได้ของการตรวจสอบสิทธิ์ PG Peer ล้มเหลว
Daniel Vérité

ตอนนี้เพื่อให้ได้รับคำตอบสำหรับคำถามข้างต้นคุณต้องเพิ่ม--interactiveคำสั่ง:createuser --interactive joe
3791372

คำตอบ:


311

ลอง:

psql -U user_name  -h 127.0.0.1 -d db_name

ที่ไหน

  • -U เป็นชื่อผู้ใช้ฐานข้อมูล
  • -h เป็นชื่อโฮสต์ / IP ของเซิร์ฟเวอร์ภายในจึงหลีกเลี่ยงซ็อกเก็ตโดเมน Unix
  • -d เป็นชื่อฐานข้อมูลที่จะเชื่อมต่อ

สิ่งนี้ถูกประเมินว่าเป็นการเชื่อมต่อ "เครือข่าย" โดย Postgresql มากกว่าการเชื่อมต่อซ็อกเก็ตโดเมน Unix ดังนั้นจึงไม่ได้รับการประเมินว่าเป็นการเชื่อมต่อแบบ "โลคัล" อย่างที่คุณเห็นในpg_hba.conf:

local   all             all                                     peer

15
ฉันต้องการ (เวอร์ชั่น 9.4): psql -U user-name -h 127.0.0.1 -d db-name
Gregor

9
เครื่องมือช่างเป็นอะไร คู่มือบอกว่าpsql [option...] [dbname [username]]คุณคิดว่าpsql dbname usernameจะได้ผล ..
djeikyb

2
ทำงานให้ฉันเช่นกัน ฉันคิดว่านี่เป็นวิธีที่ดีกว่าการเปลี่ยนไฟล์กำหนดค่าโดยเฉพาะเมื่อคุณไม่มีเงื่อนงำเกี่ยวกับสิ่งที่คุณทำและเพียงทำตามคำตอบดังนั้นเพื่อแก้ปัญหาของคุณ
borisano

1
สิ่งนี้ได้ผลสำหรับฉันขอบคุณมากแม้ว่าฉันจะทำวิจัยว่าทำไมมันถึงเป็นวิธีที่ถูกต้อง อย่างไรก็ตามในการกำหนดค่าในเครื่องอื่นฉันจะเข้าสู่ระบบในฐานะ psql -U ชื่อผู้ใช้ฐานข้อมูล -d ดังนั้นฉันเดาว่าโซลูชันที่ยอมรับนั้นขึ้นอยู่กับเคส
Lazarus Rising

2
คำตอบที่ดี. ฉันได้รับจากภายในฐานข้อมูลหลังจากที่เข้าสู่ระบบในฐานะ postgres \c glossary john FATAL: Peer authentication failed for user "john"หลังจากนั้น\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".มันก็ใช้งานได้
ดู

215

เชื่อมต่อของคุณล้มเหลวเนื่องจากโดยค่าเริ่มต้นpsqlเชื่อมต่อผ่านซ็อกเก็ต UNIX โดยใช้การตรวจสอบที่ต้องใช้ระบบปฏิบัติการยูนิกซ์ปัจจุบันจะมีชื่อผู้ใช้เช่นเดียวกับpeer psqlดังนั้นคุณจะต้องสร้างผู้ใช้ UNIX devแล้วลงชื่อเข้าdevใช้หรือใช้sudo -u dev psql test_developmentสำหรับเข้าถึงฐานข้อมูล (และไม่psqlควรถามรหัสผ่าน)

หากคุณไม่สามารถหรือไม่ต้องการสร้างผู้ใช้ UNIX เช่นถ้าคุณเพียงต้องการเชื่อมต่อกับฐานข้อมูลของคุณสำหรับการค้นหาเฉพาะกิจการบังคับใช้การเชื่อมต่อซ็อกเก็ตโดยใช้psql --host=localhost --dbname=test_development --username=dev(ดังที่คำตอบจาก @meyerson) จะแก้ปัญหาเฉพาะหน้าของคุณ

แต่ถ้าคุณตั้งใจที่จะบังคับใช้การพิสูจน์ตัวตนด้วยรหัสผ่านบนซ็อกเก็ต Unix แทนที่จะใช้วิธีเพียร์ให้ลองเปลี่ยนpg_hba.confบรรทัด * ต่อไปนี้:

จาก

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

ถึง

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peerหมายความว่ามันจะเชื่อถือข้อมูลประจำตัว (ความถูกต้อง) ของผู้ใช้ UNIX ดังนั้นอย่าขอรหัสผ่าน

  • md5MD5หมายความว่ามันมักจะถามรหัสผ่านและตรวจสอบได้หลังจากคร่ำเครียดกับ

แน่นอนคุณสามารถสร้างกฎเฉพาะสำหรับฐานข้อมูลหรือผู้ใช้ที่เฉพาะเจาะจงยิ่งขึ้นด้วยผู้ใช้บางคนมีpeerและอื่น ๆ ที่ต้องการรหัสผ่าน

หลังจากเปลี่ยนแปลงpg_hba.confหาก PostgreSQL ทำงานอยู่คุณจะต้องทำการอ่านการกำหนดค่าอีกครั้งโดยการโหลดใหม่ ( pg_ctl reload) หรือเริ่มใหม่ ( sudo service postgresql restart)

* ไฟล์pg_hba.confน่าจะอยู่ที่/etc/postgresql/9.x/main/pg_hba.conf

แก้ไข: ข้อสังเกตจาก @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_ ความคิดเห็นที่รวมกันเป็นคำตอบ


5
คุณอนุญาตให้peer และ md5อย่างไร เมื่อฉันตั้งค่าmd5แล้วฉันจะไม่สามารถเข้าสู่ระบบด้วยpostgresผู้ใช้อีกต่อไป! ฉันพยายามเพิ่มหลายบรรทัดและแยกวิธีด้วยเครื่องหมายจุลภาค แต่ไม่ได้ผล ตกลงฉันพบmgoldwasserคำตอบแล้วมันก็ใช้ได้ ฉันเพิ่งเพิ่มอีกบรรทัดสำหรับผู้ใช้postgresด้วยวิธีการpeer!
Chloe

3
ไม่ต้องกังวลคุณสามารถตั้งค่าการรับรองความถูกต้องสำหรับผู้ใช้เฉพาะ (ตัวอย่างเช่นชื่อผู้ใช้หรือ postgres ของคุณ) ดูเหมือนว่ากฎเฉพาะจะแทนที่กฎทั่วไป
JavierIEH

1
ในการแจกแจงบางไฟล์อาจพบได้ที่นี่:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher

2
คุณไม่สามารถทำสิ่งนี้ได้หากไม่รีสตาร์ท postgresql? คุณไม่สามารถระบุวิธีการรับรองความถูกต้องในตาราง pg_user ได้หรือไม่
fccoelho

2
คุณสามารถโหลดซ้ำได้ตั้งแต่รีสตาร์ท ที่โหลดตาราง pg_hba ทำงานให้ฉัน
Joanis

29

การรับรองความถูกต้องแบบเพียร์หมายความว่า postgres ถามระบบปฏิบัติการสำหรับชื่อเข้าสู่ระบบของคุณและใช้สิ่งนี้สำหรับการตรวจสอบ ในการเข้าสู่ระบบในฐานะผู้ใช้ "dev" โดยใช้การรับรองความถูกต้องของเพื่อนบน postgres คุณต้องเป็นผู้ใช้ "dev" บนระบบปฏิบัติการ

คุณสามารถค้นหารายละเอียดวิธีการตรวจสอบในเอกสาร PostgreSQL

คำแนะนำ:หากไม่มีวิธีการตรวจสอบความถูกต้องอีกต่อไปให้ปลดการเชื่อมต่อเซิร์ฟเวอร์จากเครือข่ายและใช้วิธีการ "เชื่อใจ" สำหรับ "localhost" (และตรวจสอบอีกครั้งว่าเซิร์ฟเวอร์ของคุณไม่สามารถเข้าถึงผ่านเครือข่ายได้


1
ขอบคุณสำหรับ answers.but ของคุณก็ยังจะไม่ได้ทำงานถ้าฉันเปลี่ยนdevให้กับผู้ใช้ระบบXXX
hsming

2
คำตอบของสเตฟานนั้นถูกต้อง ฉันเพิ่งเพิ่มลิงค์ซึ่งจะปรากฏเมื่อแก้ไขการตรวจทานของฉันไปยังเอกสารที่อธิบายวิธีการตรวจสอบแต่ละวิธี
dsh

25

เมื่อคุณระบุ:

psql -U user

มันเชื่อมต่อผ่านซ็อกเก็ต UNIX ซึ่งโดยปกติจะใช้การpeerตรวจสอบความถูกต้องเว้นแต่จะระบุไว้เป็นpg_hba.confอย่างอื่น

คุณสามารถระบุ:

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

ที่จะได้รับการเชื่อมต่อ TCP / IP บนอินเตอร์เฟซวนรอบ (ทั้ง IPv4 และ IPv6) เพื่อระบุและdatabaseuser

หลังจากการเปลี่ยนแปลงคุณต้องรีสตาร์ท postgres หรือโหลดใหม่การกำหนดค่า รีสตาร์ทที่ควรทำงานใน distros ตาม RHEL / Debian ที่ทันสมัย:

service postgresql restart

การโหลดซ้ำควรทำงานในลักษณะต่อไปนี้:

pg_ctl reload

แต่คำสั่งอาจแตกต่างกันไปตามการกำหนดค่า PATH - คุณอาจต้องระบุพา ธ สัมบูรณ์ซึ่งอาจแตกต่างกันไปขึ้นอยู่กับวิธีการติดตั้ง postgres

จากนั้นคุณสามารถใช้:

psql -h localhost -U user -d database

เพื่อเข้าสู่ระบบด้วยที่userจะระบุdatabaseผ่าน TCP / IP md5ย่อมาจากรหัสผ่านที่เข้ารหัสในขณะที่คุณยังสามารถระบุpasswordรหัสผ่านข้อความธรรมดาในระหว่างการอนุญาต ตัวเลือกทั้งสองนี้ไม่ควรเป็นเรื่องใหญ่ตราบใดที่เซิร์ฟเวอร์ฐานข้อมูลเข้าถึงได้ในเครื่องเท่านั้นโดยไม่มีการเข้าถึงเครือข่าย

หมายเหตุสำคัญ: ลำดับการกำหนดในpg_hba.confเรื่อง - กฎจะอ่านจากบนลงล่างเช่น iptables ดังนั้นคุณอาจต้องการเพิ่มกฎที่เสนอไว้เหนือกฎ:

host    all             all             127.0.0.1/32            ident

ข้อความสำคัญ: - คำสั่งซื้อเป็นสิ่งสำคัญ +1
hawkeye

23

แม้ว่าคำตอบ @ flaviodesousa จะใช้ได้ แต่ก็ทำให้ผู้ใช้ทุกคน (ทุกคน) ต้องป้อนรหัสผ่าน

บางครั้งมันก็สมเหตุสมผลที่จะเก็บการรับรองความถูกต้องแบบเพียร์ให้กับคนอื่น แต่ให้ยกเว้นสำหรับผู้ใช้ ในกรณีนั้นคุณต้องการเพิ่มบรรทัดใน pg_hba.conf ที่มีลักษณะดังนี้:

local   all             some_batch_user                         md5

ฉันขอแนะนำให้คุณเพิ่มบรรทัดนี้ด้านล่างบรรทัดส่วนหัวที่แสดงความคิดเห็น:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

คุณจะต้องรีสตาร์ท PostgreSQL โดยใช้

sudo service postgresql restart

หากคุณใช้ 9.3 pg_hba.conf ของคุณน่าจะเป็น:

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


12

สิ่งนี้ใช้ได้กับฉันเมื่อฉันพบเจอ:

sudo -u username psql

ใช้ได้เฉพาะเมื่อคุณสร้างผู้ใช้ใหม่ทั้งหมดบนระบบและใน postgres - hsming เพียงต้องการเชื่อมต่อกับ postgres กับผู้ใช้ postgres ที่สร้างขึ้นใหม่, dev.
เคนเน็ ธ

8

ทางออกที่ง่ายที่สุด:

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

6

ฉันต้องเพิ่ม -h localhost


ปัญหาของฉันใช้ postgres ใน Raspberry ^^^ ได้ผลสำหรับฉัน !! ขอบคุณ!
tidydee

2

ในกรณีของฉันฉันใช้พอร์ตอื่น ค่าเริ่มต้นคือ 5432 ฉันใช้ 5433 สิ่งนี้เหมาะสำหรับฉัน:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433

สิ่งนี้สามารถเกิดขึ้นได้โดยอัตโนมัติเมื่อคุณติดตั้ง postgres มากกว่าหนึ่งครั้ง
Galigator

1

สำหรับคนในอนาคตที่เห็นสิ่งนี้postgresอยู่ใน/usr/lib/postgresql/10/binเซิร์ฟเวอร์ Ubuntu ของฉัน

ฉันเพิ่มลงใน PATH ในไฟล์. bashrc ของฉันและเพิ่มบรรทัดนี้ในตอนท้าย

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

จากนั้นในบรรทัดคำสั่ง

$> source ./.bashrc

ฉันรีเฟรชสภาพแวดล้อมการทุบตีของฉัน ตอนนี้ฉันสามารถใช้postgres -D /whereverจากไดเรกทอรีใด ๆ


1

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


คำตอบนี้มีคำถามอะไร ทำไมอาจ-U postgresเป็นการพิจาณา? อะไรคือทุกคนรีบตัวอักษรหรือไม่?
greybeard

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.