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설정을 추가 했고 작동했습니다.

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