Соединение Django с PostgreSQL: «Ошибка аутентификации равноправного узла»

111
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

Это ошибка, которую я получаю, когда пытаюсь попасть на мой сайт администратора Django. Я не использовал MySQL. Я новичок в PostgreSQL, но решил переключиться, потому что хост, который я в конечном счете планирую использовать для этого проекта, не имеет MySQL.

Поэтому я решил, что смогу пройти процесс установки PostgreSQL, запустите syncdb и все будет установлено.

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

Кроме того, я могу использовать manage.py shell для быстрого доступа к db.

Любые мысли?

Теги:

5 ответов

184
Лучший ответ

Я заглянул за исключение, заметил, что это связано с настройками подключения. Вернулся к 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
    вы можете рассмотреть возможность перехода от вашего вопроса к вашему ответу (и принять его). Таким образом, вопрос останется вопросом, и он будет иметь правильно предоставленный ответ. Кстати: хорошая работа! :-)
  • 0
    Сделаю. Благодарю.
Показать ещё 9 комментариев
17

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

Если вы используете PostgreSQL по умолчанию (пустой HOST), соединение с база данных выполняется через сокеты домена UNIX ("локальные строки в pg_hba.conf). Если вы хотите подключиться через сокеты TCP, установите HOST для 'Localhost или' 127.0.0.1 ('хост-строки в pg_hba.conf). В Windows, вы всегда должны определять HOST, поскольку UNIX-сокеты не являются доступны.

Если вы хотите продолжать использовать сокеты, необходимы правильные настройки в pg_hba.conf. Самый простой способ:

local   all         all                               trust

комментируя все остальные строки local в конфиге. Обратите внимание, что для вступления изменений в силу требуется перезагрузка postgres.

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

  • 2
    Это должно быть ответом ... (больше документов, больше объяснений)
12

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

# "local" is for Unix domain socket connections only
local   all         all                           md5
  • 5
    +1; но обратите внимание, что md5 в целом (немного) лучше, чем пароль, поскольку он отправляет хэш, а не пароль. (Когда локально это не имеет большого значения; но если вы делаете это по сети с возможными перехватчиками, это важно.)
  • 0
    Если PostgreSQL не солит хэши паролей - и я не знаю, делает ли он это или нет - тогда любой, достаточно опытный, чтобы подслушивать ваше соединение, вероятно, собирается запустить ваш хэш через радужную таблицу и в любом случае нарушить вашу безопасность.
Показать ещё 1 комментарий
6

Я исправил это, отредактировав нижнюю часть /etc/postgres/ 9.1/main/pg_hba.conf(изменив md5 на доверие; NOTE это означает, что не будет пароля базы данных, который может быть не таким, каким вы хотите)

# 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
2

Я просто наткнулся на ту же проблему, но хотел использовать unix-сокеты, как сказал clime, но все еще используя метод peer. Я сопоставил имя моей системы с именем postgres-username внутри pg_hba.conf, которое работает с методом peer.

Внутри pg_hba.conf я добавил:

local all all peer map=map-name

Внутри pg_ident.conf я добавил:

map-name mysystem-username mypostgres-username

Ещё вопросы

Сообщество Overcoder
Наверх
Меню