Підключення Джанго до PostgreSQL: "Невдала аутентифікація одноранців"


120
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

Це помилка, яку я отримую, коли намагаюся потрапити на сайт адміністратора Django. Я використовував базу даних MySQL без проблем. Я новачок у PostgreSQL, але вирішив перейти, оскільки хост, який я врешті-решт планую використовувати для цього проекту, не має MySQL.

Тому я зрозумів, що можу пройти процес установки PostgreSQL, запустити a syncdbі бути все готовим.

Проблема в тому, що я не можу отримати свій додаток для підключення до бази даних. Я можу увійти в PostgreSQL через завантажений я командний рядок або настільний додаток. Тільки не за сценарієм.

Крім того, я можу використовувати manage.py shellдля доступу до db просто чудово.

Будь-які думки?

Відповіді:


218

Я зазирнув до винятку, помітив, що це стосується моїх налаштувань з'єднання. Повернувся до settings.py і побачив, що у мене немає налаштування хоста. Додайте localhostі вуаля.

У моїх настройках.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
ви можете розглянути питання про перенесення рішення з питання до своєї відповіді (і прийняття його). Таким чином, питання залишатиметься питанням і на нього буде відповідна належна відповідь. До речі: хороша робота! :-)
Пьотр Новицький

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.
Джим Гаррісон

3
Документація ( docs.djangoproject.com/en/1.6/ref/settings/#host ) лежить: "HOST [...] Порожній рядок означає localhost". Це неправда, у мене була така ж проблема, і я вирішив це, написавши "localhost". Дякую за пораду.
Марко Сулла

1
Ах ХА! Я знав, що я ЗНАЮ пароль. Мецанін виробляє local_settings.pyфайл і # Set to empty string for localhost. Not used with sqlite3.знаходиться в їх. ЛЖИ !!!
teewuane

23

Це, мабуть, тому, що ваш сценарій працює під іншим користувачем, ніж той, з яким ви намагаєтесь зв’язатися ( тут використовується мій користувач ). У цьому випадку аутентифікація однорангових систем не вдасться. Ваше рішення HOST: "localhost"працює, тому що ви більше не використовуєте аутентифіковану аутентифікацію. Однак це відбувається повільніше, HOST: ""оскільки замість того, щоб використовувати сокети Unix, ви використовуєте TCP-з'єднання. З док. Django :

Якщо ви використовуєте PostgreSQL, за замовчуванням (порожній HOST) підключення до бази даних здійснюється через сокети домену UNIX ('локальні' рядки в pg_hba.conf). Якщо ви хочете підключитися через TCP-сокети, встановіть HOST на 'localhost' або '127.0.0.1' (рядки 'host' у pg_hba.conf). У Windows завжди слід визначати HOST, оскільки розетки домену UNIX недоступні.

Якщо ви хочете продовжувати використовувати розетки, потрібні правильні налаштування pg_hba.conf. Найпростіший:

local   all         all                               trust

при цьому коментуючи всі інші localрядки в налаштуваннях. Зауважте, що для того, щоб ця зміна набула чинності, потрібно перезавантажити постгреси.

Але якщо питання про багатокористувацьку виробничу машину піддається сумніву, ви можете скористатися чим-небудь більш безпечним, як-от md5(див. Тут для пояснення різних методів аутентифікації).


14

Краще, ніж повністю довіряти - просто встановити його на md5.

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

5
+1; але зверніть увагу, md5 взагалі (трохи) кращий за пароль, оскільки він надішле хеш на відміну від пароля. (Коли локально, це не має великого значення; але якщо робити це через мережу з можливими підслуховувачами, це важливо.)
dr jimbob

Якщо PostgreSQL не соліть хеши паролів - а я не знаю, чи це так, чи ні - тоді хтось досить складний, щоб насправді підслухати ваше з'єднання, ймовірно, запустить ваш хеш через таблицю веселки і все одно порушить вашу безпеку.
Лінді Саймон

"md5" краще, ніж "довіра", але найкраще використовувати "peer" та створювати користувача Linux без дозволів для входу, лише для локальних з'єднань. Таким чином, ви повинні вказати свій кореневий пароль, щоб отримати доступ до db з локального.
Марко Сулла

6

Я це виправив, відредагувавши нижню частину /etc/postgres/9.1/main/pg_hba.conf, щоб бути (змінивши md5 на довіру; ПРИМІТКА. Це означає, що не буде пароля бази даних, який може бути не тим, що вам потрібно)

# 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.