Kết nối Django với PostgreSQL: "Xác thực ngang hàng không thành công"


120
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

Đây là lỗi mà tôi nhận được khi cố truy cập trang web quản trị Django của mình. Tôi đã sử dụng cơ sở dữ liệu MySQL không có vấn đề gì. Tôi mới sử dụng PostgreSQL, nhưng quyết định chuyển đổi vì máy chủ cuối cùng mà tôi định sử dụng cho dự án này không có MySQL.

Do đó, tôi nghĩ rằng tôi có thể thực hiện quá trình cài đặt PostgreSQL, chạy một syncdbvà hoàn tất.

Vấn đề là tôi dường như không thể kết nối ứng dụng của mình với cơ sở dữ liệu. Tôi có thể đăng nhập vào PostgreSQL thông qua dòng lệnh hoặc ứng dụng dành cho máy tính để bàn mà tôi đã tải xuống. Chỉ không có trong kịch bản.

Ngoài ra, tôi có thể sử dụng manage.py shellđể truy cập db tốt.

Có suy nghĩ gì không?

Câu trả lời:


218

Tôi đã xem xét ngoại lệ, nhận thấy nó liên quan đến cài đặt kết nối của tôi. Quay lại settings.py và thấy tôi chưa thiết lập Máy chủ lưu trữ. Thêm vàolocalhost và thì đấy.

Settings.py của tôi không có HOST cho cơ sở dữ liệu MySQL, nhưng tôi cần thêm một HOST để PostgreSQL hoạt động.

Trong trường hợp của tôi, tôi đã thêm localhostvàoHOST thiết lập và nó làm việc.

Đây là DATABASESphần từ của tôi 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
bạn có thể cân nhắc chuyển giải pháp từ câu hỏi sang câu trả lời của mình (và chấp nhận nó). Bằng cách này, câu hỏi sẽ vẫn là một câu hỏi và nó sẽ có câu trả lời thích hợp. BTW: làm tốt lắm! :-)
Piotr Nowicki

3
Gặp vấn đề tương tự với ứng dụng Rails và đó là giải pháp tương tự - máy chủ lưu trữ cần được định cấu hình config/database.yml- nghĩa là, trong tệp đó, tôi cần thêm dòng host: localhost(hoặc bất cứ nơi nào máy chủ postgres của bạn - máy chủ của tôi là cục bộ)
jefflunt

7
Khi HOST trống, Django cố gắng kết nối với cơ sở dữ liệu bằng các ổ cắm UNIX. Mặt khác, khi HOST là "localhost", nó kết nối qua TCP / IP tới 127.0.0.1. Có thể, của bạn pg_hba.confđược thiết lập để từ chối người dùng thông thường kết nối qua ổ cắm UNIX nhưng cho phép họ qua TCP / IP từ localhost.
Jim Garrison

3
Tài liệu ( docs.djangoproject.com/en/1.6/ref/settings/#host ) nói rằng: "HOST [...] Một chuỗi trống có nghĩa là localhost". Điều này không đúng, tôi đã gặp vấn đề tương tự và tôi đã sửa lỗi viết 'localhost'. Cảm ơn vì tiền boa.
Marco Sulla

1
À HA! Tôi biết tôi đã BIẾT mật khẩu. Mezzanine tạo ra một local_settings.pytệp và tệp # Set to empty string for localhost. Not used with sqlite3.nằm trong tệp của chúng. DỐI TRÁ!!!
teewuane

23

Đó có lẽ là vì kịch bản của bạn đang chạy theo một số người dùng khác so với cái bạn đang cố gắng để kết nối với ( myuser đây). Trong trường hợp này, xác thực ngang hàng sẽ không thành công. Giải pháp của bạn với hiệu HOST: "localhost"quả vì bạn không sử dụng xác thực ngang hàng nữa. Tuy nhiên, nó chậm hơn HOST: ""vì thay vì sử dụng ổ cắm unix, bạn sử dụng kết nối TCP. Từ tài liệu django :

Nếu bạn đang sử dụng PostgreSQL, theo mặc định (HOST trống), kết nối với cơ sở dữ liệu được thực hiện thông qua các ổ cắm miền UNIX (dòng 'cục bộ' trong pg_hba.conf). Nếu bạn muốn kết nối qua cổng TCP, hãy đặt HOST thành 'localhost' hoặc '127.0.0.1' (các dòng 'host' trong pg_hba.conf). Trên Windows, bạn phải luôn xác định HOST, vì các ổ cắm miền UNIX không khả dụng.

Nếu bạn muốn tiếp tục sử dụng ổ cắm, pg_hba.confcần có các cài đặt chính xác . Đơn giản nhất là:

local   all         all                               trust

trong khi bình luận tất cả những thứ khác local dòng trong cấu hình. Lưu ý rằng cần tải lại các postgres để thay đổi này có hiệu lực.

Nhưng nếu máy sản xuất nhiều người dùng đang được nghi ngờ, bạn có thể muốn sử dụng thứ gì đó an toàn hơn như md5(xem ở đây để giải thích về các phương pháp xác thực khác nhau).


14

Tốt hơn là hoàn toàn tin tưởng chỉ là đặt nó thành md5.

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

5
+1; nhưng lưu ý rằng md5 nói chung (một chút) tốt hơn mật khẩu vì nó sẽ gửi một hàm băm thay vì mật khẩu. (Khi địa phương nó không quan trọng nhiều, nhưng nếu làm việc đó qua mạng với người nghe trộm có thể nó rất có ý nghĩa.)
dr jimbob

Nếu PostgreSQL không sử dụng hàm băm mật khẩu - và tôi không biết nó có hay không - thì bất kỳ ai đủ tinh vi để thực sự nghe trộm kết nối của bạn có thể sẽ chạy hàm băm của bạn thông qua bảng cầu vồng và phá vỡ bảo mật của bạn.
Lyndsy Simon

"md5" tốt hơn "trust", nhưng tốt nhất là sử dụng "peer" và tạo người dùng Linux không có quyền đăng nhập, chỉ dành cho các kết nối cục bộ. Bằng cách này, bạn phải cung cấp mật khẩu gốc của mình để truy cập db từ cục bộ.
Marco Sulla

6

Tôi đã sửa lỗi này bằng cách chỉnh sửa phần cuối của /etc/postgres/9.1/main/pg_hba.conf thành (thay đổi md5 thành trust; LƯU Ý điều này có nghĩa là sẽ không có mật khẩu cơ sở dữ liệu, có thể không phải là những gì bạn muốn)

# 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

Tôi chỉ tình cờ gặp vấn đề tương tự nhưng muốn sử dụng ổ cắm unix như clime đã nói, nhưng vẫn sử dụng peerphương pháp này. Tôi đã ánh xạ tên người dùng hệ thống của mình với tên người dùng postgres bên trong pg_hba.conf, đang hoạt động với peerphương pháp này.

Bên trong pg_hba.conftôi đã thêm:

local all all peer map=map-name

Bên trong pg_ident.conftôi đã thêm:

map-name mysystem-username mypostgres-username
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.