Подключение 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и вуаля.

В моем 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
вы можете подумать о том, чтобы перенести решение с вашего вопроса на свой ответ (и принять его). Таким образом, вопрос останется вопросом и на него будет дан правильный ответ. Кстати: хорошая работа! :-)
Петр Новицки
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
Ага! Я знал, что ЗНАЮ пароль. Mezzanine производит local_settings.pyфайл и # Set to empty string for localhost. Not used with sqlite3.находится в их. ВРАНЬЕ!!!
teewuane
24

Вероятно, это связано с тем, что ваш скрипт работает под другим пользователем, отличным от того, с которым вы пытаетесь подключиться ( здесь myuser ). В этом случае аутентификация однорангового узла не удастся. Ваше решение HOST: "localhost"работает, потому что вы больше не используете одноранговую аутентификацию. Однако это медленнее, чем HOST: ""из-за того, что вместо сокетов unix вы используете TCP-соединения. Из django docs :

Если вы используете 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строки в config. Обратите внимание, что для того, чтобы это изменение вступило в силу, необходимо перезагрузить postgres.

Но если речь идет о многопользовательской производственной машине, вы можете использовать что-то более безопасное, например md5(см. Здесь для объяснения различных методов аутентификации).

климат
источник
15

Лучше, чем полностью доверять, - это просто установить его на md5.

# "local" is for Unix domain socket connections only
local   all         all                           md5
Houman
источник
6
+1; но обратите внимание, что md5 в целом (немного) лучше, чем пароль, поскольку он отправляет хэш, а не пароль. (Когда локально это не имеет большого значения; но если делать это по сети с возможными перехватчиками, это важно.)
dr jimbob
Если PostgreSQL не использует хэши паролей - а я не знаю, есть ли это или нет - то любой, кто достаточно опытен, чтобы на самом деле подслушивать ваше соединение, вероятно, пропустит ваш хеш через радужную таблицу и так или иначе нарушит вашу безопасность.
Lyndsy Simon
1
«md5» лучше, чем «trust», но лучше всего использовать «peer» и создать пользователя Linux без разрешений на вход только для локальных подключений. Таким образом, вы должны предоставить свой пароль root для доступа к базе данных из локального.
Марко Сулла
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
вИДЕЛ
источник