2011-11-17 118 views
109
OperationalError at /admin/ 

FATAL: Peer authentication failed for user "myuser" 

Đây là lỗi tôi nhận được khi tôi cố truy cập trang 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 dùng PostgreSQL, nhưng đã quyết định chuyển đổi vì máy chủ cuối cùng tôi dự định sử dụng cho dự án này không có MySQL.Kết nối Django với PostgreSQL: "Xác thực ngang hàng không thành công"

Vì vậy, tôi đã tìm tôi có thể thực hiện quá trình cài đặt PostgreSQL, chạy syncdb và tất cả được đặt.

Vấn đề là tôi dường như không thể khiến ứng dụng của mình kết nối 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 máy tính để bàn mà tôi đã tải xuống. Chỉ cần không có trong kịch bản.

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

Mọi suy nghĩ?

Trả lời

187

Tôi đã xem xét ngoại lệ, nhận thấy nó phải làm gì với cài đặt kết nối của tôi. Đã quay lại settings.py và thấy tôi không có Thiết lập máy chủ. Thêm localhost 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 cho PostgreSQL để hoạt động.

Trong trường hợp của tôi, tôi đã thêm localhost vào cài đặt HOST và hoạt động.

Đây là phần DATABASES từ số settings.py của tôi.

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ể xem xét chuyển dung dịch từ câu hỏi của bạn để trả lời của bạn (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ẽ cung cấp câu trả lời đúng cách. BTW: tốt lắm! :-) –

+0

Sẽ làm. Cảm ơn. –

+0

Đã gặp sự cố tương tự với Rails 3 và đề xuất của bạn đã khắc phục được sự cố. Chúc mừng! – Marco

6

tôi cố định này bằng cách chỉnh sửa dưới cùng của /etc/postgres/9.1/main/pg_hba.conf được (thay đổi md5 để tin tưởng; lưu ý điều này có nghĩa sẽ không có mật khẩu cơ sở dữ liệu, mà có thể không được 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 
13

Tốt hơn là hoàn toàn tin cậy chỉ để đặt thành md5.

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

+1; nhưng lưu ý md5 nói chung (hơi) tốt hơn mật khẩu vì nó sẽ gửi một băm như trái ngược với mật khẩu. (Khi địa phương nó không quan trọng nhiều, nhưng nếu làm điều đó qua mạng với những kẻ nghe trộm có thể thì điều đó là quan trọng.) –

+0

Nếu PostgreSQL không làm băm mật khẩu muối - và tôi không biết liệu nó có hay không - thì bất cứ ai tinh vi đủ để thực sự nghe trộm trên kết nối của bạn có lẽ sẽ chạy băm của bạn thông qua một bảng cầu vồng và phá vỡ an ninh của bạn dù sao đi nữa. –

+0

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

18

Đó 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 HOST: "localhost" hoạt động vì bạn không sử dụng auth peer 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ừ django docs:

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

Nếu bạn muốn tiếp tục sử dụng ổ cắm, hãy chỉnh sửa cài đặt trong pg_hba.conf.Cách đơn giản nhất là:

local all   all        trust 

trong khi nhận xét tất cả các dòng khác local trong cấu hình. Lưu ý rằng tải lại postgres là cần thiết để 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 được đề cập đến, bạn có thể muốn sử dụng một cái gì đó an toàn hơn như md5 (xem here để được giải thích về các phương thức xác thực khác nhau).

+1

Điều này sẽ là anwer ... (thêm tài liệu, giải thích thêm) – ThePhi

3

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 cho biết, nhưng vẫn sử dụng phương pháp peer. Tôi đã ánh xạ tên người dùng hệ thống của mình bằng tên người dùng postgres bên trong pg_hba.conf, đang làm việc với phương thức peer.

Bên pg_hba.conf tôi nói thêm:

local all all peer map=map-name 

Bên pg_ident.conf tôi nói thêm:

map-name mysystem-username mypostgres-username 
Các vấn đề liên quan