PostgreSQL에 대한 Django 연결 : "피어 인증 실패"


120
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

이것은 Django 관리 사이트에 접속하려고 할 때받는 오류입니다. 나는 MySQL 데이터베이스를 사용하고 있었다. 저는 PostgreSQL을 처음 사용했지만 궁극적으로이 프로젝트에 사용할 호스트에 MySQL이 없기 때문에 전환하기로 결정했습니다.

따라서 PostgreSQL을 설치 syncdb하고 a를 실행하고 모든 설정을 완료 할 수 있다고 생각했습니다 .

문제는 내 앱을 데이터베이스에 연결할 수 없다는 것입니다. 다운로드 한 명령 줄 또는 데스크톱 앱을 통해 PostgreSQL에 로그인 할 수 있습니다. 대본에서는 아닙니다.

또한 manage.py shelldb에 액세스하는 데 사용할 수 있습니다 .

이견있는 사람?

답변:


218

예외를 살짝 들여다 보니 연결 설정과 관련이 있다는 것을 알았습니다. settings.py로 돌아가서 호스트 설정이 없다는 것을 알았습니다. 추가 localhost하고 짜잔.

내 settings.py에는 MySQL 데이터베이스 용 HOST가 없지만 PostgreSQL이 작동하려면 HOST를 추가해야했습니다.

제 경우 localhost에는 HOST설정을 추가 했고 작동했습니다.

다음은 DATABASESsettings.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
질문에서 답변으로 솔루션을 옮기고 수락하는 것을 고려할 수 있습니다. 이런 식으로 질문은 질문으로 남아 있고 적절하게 답변을 제공 할 것입니다. BTW : 잘 했어요! :-)
Piotr Nowicki

3
Rails 앱에 동일한 문제가 있었으며 동일한 솔루션이었습니다-호스트를 구성해야했습니다 config/database.yml-즉, 해당 파일에 줄을 추가해야했습니다 host: localhost(또는 postgres 서버가있는 곳-내 것이 로컬이었습니다).
제플 런트

7
HOST가 비어 있으면 Django는 UNIX 소켓을 사용하여 데이터베이스에 연결을 시도합니다. 반면 HOST가 "localhost"이면 TCP / IP를 통해 127.0.0.1에 연결합니다. 아마도 pg_hba.conf일반 사용자가 UNIX 소켓을 통해 연결하는 것을 거부하도록 설정되어 있지만 localhost에서 TCP / IP를 통해 연결할 수 있습니다.
Jim Garrison

3
문서 ( docs.djangoproject.com/en/1.6/ref/settings/#host ) 거짓말 : "HOST [...] 빈 문자열은 localhost를 의미합니다." 이것은 사실이 아니며 동일한 문제가 있었고 'localhost'를 작성하여 수정했습니다. 팁 주셔서 감사합니다.
Marco Sulla

1
아 하! 암호를 알고 있다는 것을 알고있었습니다. 메 자닌은 local_settings.py파일을 생성 하고 그 # Set to empty string for localhost. Not used with sqlite3.안에 있습니다. 거짓말 !!!
teewuane

23

아마도 당신의 스크립트가 당신이 연결하려는 사용자 ( 여기서는 myuser ) 가 아닌 다른 사용자로 실행되고 있기 때문일 것입니다 . 이 경우 피어 인증이 실패합니다. HOST: "localhost"더 이상 피어 인증을 사용하지 않기 때문에 솔루션이 작동합니다. 그러나 HOST: ""유닉스 소켓을 사용하는 대신 TCP 연결을 사용하기 때문에 속도가 느립니다 . 에서 장고 문서 :

PostgreSQL을 사용하는 경우 기본적으로 (빈 HOST) 데이터베이스 연결은 UNIX 도메인 소켓 (pg_hba.conf의 'local'줄)을 통해 수행됩니다. TCP 소켓을 통해 연결하려면 HOST를 'localhost'또는 '127.0.0.1'(pg_hba.conf의 'host'행)으로 설정하십시오. Windows에서는 UNIX 도메인 소켓을 사용할 수 없으므로 항상 HOST를 정의해야합니다.

소켓을 계속 사용하려면 올바른 설정 pg_hba.conf이 필요합니다. 가장 간단한 방법은 다음과 같습니다.

local   all         all                               trust

local구성의 다른 모든 줄 을 주석 처리하는 동안 . 이 변경 사항을 적용하려면 postgres를 다시로드해야합니다.

그러나 다중 사용자 프로덕션 시스템에 문제가있는 경우보다 안전한 것을 사용할 수 있습니다 md5( 다양한 인증 방법에 대한 설명 은 여기 참조 ).


14

완전히 신뢰하는 것보다 md5로 설정하는 것이 좋습니다.

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

5
+1; 그러나 md5는 일반적으로 암호가 아닌 해시를 보내므로 암호보다 (약간) 더 좋습니다. (로컬 일 때는 그다지 중요하지 않지만, 도청 가능성이있는 네트워크를 통해 수행하는 경우 중요합니다.)
dr jimbob

PostgreSQL이 암호 해시를 솔트하지 않는 경우 (그 것인지 아닌지 모르겠습니다.) 실제로 연결을 도청 할만큼 정교한 사람은 아마 레인보우 테이블을 통해 해시를 실행하여 보안을 깨뜨릴 것입니다.
Lyndsy Simon

"md5"는 "trust"보다 낫지 만 "peer"를 사용하고 로컬 연결에 대해서만 로그인 권한없이 Linux 사용자를 만드는 것이 가장 좋습니다. 이렇게하면 로컬에서 db에 액세스하려면 루트 암호를 제공해야합니다.
Marco Sulla 2013

6

/etc/postgres/9.1/main/pg_hba.conf의 하단을 편집하여이 문제를 해결했습니다.

# 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

나는 같은 문제를 발견했지만 풍토가 말한 것처럼 유닉스 소켓을 사용하고 싶었지만 여전히 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.