การเชื่อมต่อ Django กับ PostgreSQL:“ การพิสูจน์ตัวตนแบบเพียร์ล้มเหลว”


122
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

นี่เป็นข้อผิดพลาดที่ฉันได้รับเมื่อพยายามเข้าสู่ไซต์ผู้ดูแลระบบ Django ของฉัน ฉันใช้ฐานข้อมูล MySQL แล้วไม่มีปัญหา ฉันยังใหม่กับ PostgreSQL แต่ตัดสินใจเปลี่ยนเพราะโฮสต์ที่ฉันวางแผนจะใช้สำหรับโปรเจ็กต์นี้ในท้ายที่สุดไม่มี MySQL

ดังนั้นฉันคิดว่าฉันสามารถทำตามขั้นตอนการติดตั้ง PostgreSQL เรียกใช้syncdbและตั้งค่าทั้งหมด

ปัญหาคือดูเหมือนว่าฉันไม่สามารถให้แอปเชื่อมต่อกับฐานข้อมูลได้ ฉันสามารถล็อกอินเข้าสู่ PostgreSQL ผ่านทางบรรทัดคำสั่งหรือแอพเดสก์ท็อปที่ดาวน์โหลดมา แค่ไม่ได้อยู่ในสคริปต์

นอกจากนี้ฉันสามารถใช้manage.py shellเพื่อเข้าถึงฐานข้อมูลได้ดี

ความคิดใด ๆ ?

คำตอบ:


220

ฉันมองไปที่ข้อยกเว้นสังเกตว่ามันเกี่ยวข้องกับการตั้งค่าการเชื่อมต่อของฉัน กลับไปที่settings.pyและเห็นว่าฉันไม่มีการตั้งค่าโฮสต์ เพิ่มlocalhostและ voila

settings.py ของฉันไม่มี HOST สำหรับฐานข้อมูล MySQL แต่ฉันต้องการเพิ่มหนึ่งเพื่อให้ PostgreSQL ใช้งานได้

ในกรณีของฉันฉันเพิ่มlocalhostไปยังการHOSTตั้งค่าและมันใช้งานได้

นี่คือDATABASESส่วนจากsettings.pyไฟล์.

DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '<MYDATABASE>', 
        'USER': '<MYUSER>', 
        'PASSWORD': '<MYPASSWORD>', 
        'HOST': 'localhost', # the missing piece of the puzzle 
        'PORT': '', # optional, I don't need this since I'm using the standard port
    } 
}

5
คุณอาจพิจารณาย้ายการแก้ปัญหาจากคำถามของคุณไปเป็นคำตอบของคุณ (และยอมรับ) ด้วยวิธีนี้คำถามจะยังคงเป็นคำถามและจะมีคำตอบที่เหมาะสม BTW: ทำได้ดีมาก! :-)
Piotr Nowicki

3
มีปัญหาเดียวกันกับแอป Rails และเป็นวิธีแก้ปัญหาเดียวกัน - โฮสต์ต้องได้รับการกำหนดค่าconfig/database.yml- กล่าวคือในไฟล์นั้นฉันต้องเพิ่มบรรทัดhost: localhost(หรือที่ใดก็ตามที่คุณใช้เซิร์ฟเวอร์ postgres - ของฉันอยู่ในพื้นที่)
jefflunt

7
เมื่อ HOST ว่างเปล่า Django จะพยายามเชื่อมต่อกับฐานข้อมูลโดยใช้ซ็อกเก็ต UNIX ในทางกลับกันเมื่อ HOST เป็น "localhost" จะเชื่อมต่อผ่าน TCP / IP ไปยัง 127.0.0.1 เป็นไปได้ว่าคุณpg_hba.confถูกตั้งค่าให้ปฏิเสธผู้ใช้ทั่วไปจากการเชื่อมต่อผ่านซ็อกเก็ต UNIX แต่อนุญาตให้ใช้ผ่าน TCP / IP จาก localhost
Jim Garrison

3
เอกสารประกอบ ( docs.djangoproject.com/en/1.6/ref/settings/#host ) อยู่: "HOST [... ] สตริงว่างหมายถึง localhost" นี่ไม่เป็นความจริงฉันมีปัญหาเดียวกันและฉันแก้ไขแล้วโดยเขียนว่า 'localhost' ขอบคุณสำหรับเคล็ดลับ
Marco Sulla

1
อาฮ่า! ฉันรู้ว่าฉันรู้รหัสผ่าน Mezzanine สร้างlocal_settings.pyไฟล์และ# Set to empty string for localhost. Not used with sqlite3.อยู่ในไฟล์. โกหก !!!
teewuane

24

นั่นอาจเป็นเพราะสคริปต์ของคุณกำลังทำงานภายใต้ผู้ใช้อื่นนอกเหนือจากที่คุณพยายามเชื่อมต่อด้วย ( myuserที่นี่) ในกรณีนี้การพิสูจน์ตัวตนแบบเพียร์จะล้มเหลว วิธีแก้ปัญหาของคุณด้วยHOST: "localhost"ผลงานเนื่องจากคุณไม่ได้ใช้ peer auth อีกต่อไป อย่างไรก็ตามมันช้ากว่าHOST: ""เนื่องจากแทนที่จะใช้ซ็อกเก็ต unix คุณใช้การเชื่อมต่อ TCP จากdjango docs :

หากคุณใช้ PostgreSQL ตามค่าเริ่มต้น (HOST ว่าง) การเชื่อมต่อกับฐานข้อมูลจะดำเนินการผ่านซ็อกเก็ตโดเมน UNIX (บรรทัด 'local' ใน pg_hba.conf) หากคุณต้องการเชื่อมต่อผ่านซ็อกเก็ต TCP ให้ตั้งค่า HOST เป็น 'localhost' หรือ '127.0.0.1' ('host' lines ใน pg_hba.conf) ใน Windows คุณควรกำหนด HOST เสมอเนื่องจากไม่สามารถใช้ซ็อกเก็ตโดเมน UNIX ได้

หากคุณต้องการใช้ซ็อกเก็ตต่อไปpg_hba.confจำเป็นต้องมีการตั้งค่าที่ถูกต้อง ง่ายที่สุดคือ:

local   all         all                               trust

ในขณะที่แสดงความคิดเห็นlocalบรรทัดอื่น ๆ ทั้งหมดในการกำหนดค่า โปรดทราบว่าจำเป็นต้องโหลด postgres ซ้ำเพื่อให้การเปลี่ยนแปลงนี้มีผล

แต่หากมีปัญหาเกี่ยวกับเครื่องการผลิตที่มีผู้ใช้หลายคนคุณอาจต้องการใช้สิ่งที่ปลอดภัยมากขึ้นเช่นmd5(ดูที่นี่สำหรับคำอธิบายเกี่ยวกับวิธีการตรวจสอบสิทธิ์ต่างๆ)


15

ดีกว่าความไว้วางใจอย่างเต็มที่เพียงแค่ตั้งค่าเป็น md5

# "local" is for Unix domain socket connections only
local   all         all                           md5

6
+1; แต่โปรดทราบว่า md5 โดยทั่วไป (เล็กน้อย) ดีกว่ารหัสผ่านเนื่องจากจะส่งแฮชเมื่อเทียบกับรหัสผ่าน (เมื่ออยู่ในพื้นที่ก็ไม่สำคัญมากนัก แต่ถ้าทำผ่านเครือข่ายโดยมีผู้ดักฟังที่เป็นไปได้ก็มีความสำคัญ)
dr jimbob

หาก PostgreSQL ไม่แฮชรหัสผ่านเกลือ - และฉันไม่รู้ว่ามันทำหรือไม่ - ใครก็ตามที่มีความซับซ้อนพอที่จะดักฟังการเชื่อมต่อของคุณอาจจะเรียกใช้แฮชของคุณผ่านตารางสายรุ้งและทำลายความปลอดภัยของคุณ
Lyndsy Simon

1
"md5" ดีกว่า "trust" แต่วิธีที่ดีที่สุดคือใช้ "peer" และสร้างผู้ใช้ Linux โดยไม่มีสิทธิ์เข้าสู่ระบบสำหรับการเชื่อมต่อภายในเครื่องเท่านั้น วิธีนี้คุณต้องระบุรหัสผ่านรูทของคุณเพื่อเข้าถึงฐานข้อมูลจากโลคัล
Marco Sulla

6

ฉันแก้ไขสิ่งนี้โดยแก้ไขด้านล่างของ /etc/postgres/9.1/main/pg_hba.conf เป็น (เปลี่ยน md5 เป็น trust; หมายเหตุนี่หมายความว่าจะไม่มีรหัสผ่านฐานข้อมูลซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ)

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
# IPv6 local connections:
host    all         all         ::1/128               trust

5

ฉันเพิ่งสะดุดกับปัญหาเดียวกัน แต่ต้องการใช้ซ็อกเก็ต unix ตามที่ clime พูด แต่ยังคงใช้peerวิธีนี้ ฉันแมปชื่อผู้ใช้ระบบของฉันกับชื่อผู้ใช้ postgres ภายในpg_hba.confซึ่งใช้งานได้กับpeerเมธอด

ข้างในpg_hba.confฉันเพิ่ม:

local all all peer map=map-name

ข้างในpg_ident.confฉันเพิ่ม:

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