psql: FATAL: Xác thực ngang hàng không thành công cho người dùng Dev dev


198

Khi tôi tạo một người dùng mới, nhưng nó không thể đăng nhập cơ sở dữ liệu.
Tôi làm như thế này:

postgres@Aspire:/home/XXX$ createuser dev
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

sau đó tạo cơ sở dữ liệu:

postgres@Aspire:/home/XXX$ createdb -O dev test_development

Sau đó, tôi cố gắng psql -U dev -W test_developmentđăng nhập, nhưng gặp lỗi:

psql: FATAL:  Peer authentication failed for user "dev"

Tôi đã cố gắng giải quyết vấn đề nhưng không thành công.


2
không thể sao chép xác thực PG Peer
Daniel Vérité

ngay bây giờ, để được nhắc trả lời cho các câu hỏi trên, bạn cần thêm --interactivevào lệnh:createuser --interactive joe
user3791372

Câu trả lời:


310

Thử:

psql -U user_name  -h 127.0.0.1 -d db_name

Ở đâu

  • -U là tên người dùng cơ sở dữ liệu
  • -h là tên máy chủ / IP của máy chủ cục bộ, do đó tránh các ổ cắm tên miền Unix
  • -d là tên cơ sở dữ liệu để kết nối với

Điều này sau đó được đánh giá là kết nối "mạng" bởi Postgresql chứ không phải là kết nối ổ cắm tên miền Unix, do đó không được đánh giá là kết nối "cục bộ" như bạn có thể thấy trong pg_hba.conf:

local   all             all                                     peer

15
Tôi cần (ver 9.4): psql -U tên người dùng -h 127.0.0.1 -d db-name
Gregor

9
Thật là một công cụ ornery. hướng dẫn nói psql [option...] [dbname [username]], vì vậy bạn nghĩ rằng psql dbname usernamesẽ chỉ hoạt động ..
djeikyb

2
Làm việc cho tôi là tốt. Tôi cũng nghĩ rằng đây là một cách thích hợp hơn nhiều so với việc thay đổi các tệp cấu hình, đặc biệt là khi bạn không có manh mối về những gì bạn đang làm và chỉ làm theo câu trả lời SO để giải quyết vấn đề của bạn.
borisano

1
điều này làm việc cho tôi, cảm ơn rất nhiều, mặc dù tôi đang thực hiện một nghiên cứu về lý do tại sao nó là giải pháp chính xác. tuy nhiên, trong một cấu hình trong một máy khác, tôi sẽ đăng nhập dưới dạng cơ sở dữ liệu tên người dùng ps -U. vì vậy tôi đoán rằng giải pháp được chấp nhận phụ thuộc vào trường hợp.
Lazarus tăng

2
Câu trả lời tốt. Tôi đã nhận được từ bên trong cơ sở dữ liệu sau khi đăng nhập như postgres \c glossary john FATAL: Peer authentication failed for user "john"sau đó với \c glossary john localhost Password for user john: SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) You are now connected to database "glossary" as user "john" on host "localhost" at port "5432".nó hoạt động.
nhìn

215

Kết nối của bạn không thành công vì theo mặc định psqlkết nối qua các socket UNIX bằng peerxác thực, điều đó đòi hỏi người dùng UNIX hiện tại phải có cùng tên người dùng như psql. Vì vậy, bạn sẽ phải tạo người dùng UNIX devvà sau đó đăng nhập devhoặc sử dụng sudo -u dev psql test_developmentđể truy cập cơ sở dữ liệu (và khôngpsql nên yêu cầu mật khẩu).

Nếu bạn không thể hoặc không muốn tạo người dùng UNIX, như nếu bạn chỉ muốn kết nối với cơ sở dữ liệu của mình cho các truy vấn đặc biệt , buộc kết nối ổ cắm bằng cách sử dụng psql --host=localhost --dbname=test_development --username=dev(như được chỉ ra bởi câu trả lời @meyerson) sẽ giải quyết vấn đề tức thời của bạn.

Nhưng nếu bạn có ý định buộc xác thực mật khẩu qua các ổ cắm Unix thay vì phương thức ngang hàng, hãy thử thay đổi pg_hba.confdòng * sau :

từ

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

đến

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peercó nghĩa là nó sẽ tin tưởng danh tính (tính xác thực) của người dùng UNIX. Vì vậy, không yêu cầu mật khẩu.

  • md5có nghĩa là nó sẽ luôn yêu cầu mật khẩu và xác thực nó sau khi băm với MD5.

Tất nhiên, bạn cũng có thể tạo các quy tắc cụ thể hơn cho cơ sở dữ liệu hoặc người dùng cụ thể, với một số người dùng có peervà những người khác yêu cầu mật khẩu.

Sau khi thay đổi pg_hba.confnếu PostgreSQL đang chạy, bạn cần phải đọc lại cấu hình bằng cách tải lại ( pg_ctl reload) hoặc khởi động lại ( sudo service postgresql restart).

* Các tập tin pg_hba.confrất có thể là tại/etc/postgresql/9.x/main/pg_hba.conf

Đã chỉnh sửa: Nhận xét từ @Chloe, @JavierEH, @Jonas E Rich, @fccoelho, @Joanis, @Uphill_What bình luận được đưa vào câu trả lời.


5
Làm thế nào để bạn cho phép peer md5 ? Khi tôi đặt md5, sau đó tôi không thể đăng nhập với postgresngười dùng nữa! Tôi đã thử thêm nhiều dòng và tách phương thức bằng dấu phẩy, nhưng chúng không hoạt động. Ok tôi đã tìm thấy mgoldwassercâu trả lời và điều đó đã làm việc. Tôi chỉ cần thêm một dòng cho người dùng postgresvới phương thức peer!
Chloe

3
Đừng lo lắng, bạn có thể đặt xác thực ngang hàng cho người dùng cụ thể (ví dụ: tên người dùng hoặc postgres của bạn). Có vẻ như các quy tắc cụ thể ghi đè lên các quy tắc chung
JavierIEH

1
Trên một số bản phân phối, tập tin cũng có thể được tìm thấy ở đây:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas E Rich

2
bạn không thể làm điều này mà không khởi động lại postgresql? bạn có thể chỉ định phương thức xác thực trong bảng pg_user không?
fccoelho

2
Bạn có thể tải lại thay vì khởi động lại. Điều đó tải lại bảng pg_hba. Đã làm cho tôi.
Joanis

29

Xác thực ngang hàng có nghĩa là postgres yêu cầu hệ điều hành cho tên đăng nhập của bạn và sử dụng tên này để xác thực. Để đăng nhập với tư cách là người dùng "dev" bằng cách sử dụng xác thực ngang hàng trên postgres, bạn cũng phải là người dùng "dev" trên hệ điều hành.

Bạn có thể tìm thấy chi tiết về các phương thức xác thực trong tài liệu Postgresql .

Gợi ý: Nếu không có phương thức xác thực nào hoạt động nữa, hãy ngắt kết nối máy chủ khỏi mạng và sử dụng phương thức "tin cậy" cho "localhost" (và kiểm tra kỹ xem máy chủ của bạn không truy cập được qua mạng trong khi phương thức "tin cậy" được bật).


1
cảm ơn câu trả lời của bạn. Nhưng nó vẫn không hoạt động nếu tôi thay đổi devngười dùng hệ thốngXXX
hsming

2
Câu trả lời của stefan là chính xác. Tôi vừa thêm một liên kết, sẽ hiển thị khi chỉnh sửa của tôi được xem xét, vào tài liệu nơi mỗi phương thức xác thực được giải thích.
dsh

25

Khi bạn chỉ định:

psql -U user

nó kết nối thông qua UNIX Socket, theo mặc định sử dụng peerxác thực, trừ khi được quy định pg_hba.confkhác.

Bạn có thể chỉ định:

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

để có được kết nối TCP / IP trên giao diện loopback (cả IPv4 và IPv6) cho chỉ định databaseuser.

Sau khi thay đổi, bạn phải khởi động lại postgres hoặc tải lại cấu hình của nó. Khởi động lại mà nên hoạt động trong các bản phân phối dựa trên RHEL / Debian hiện đại:

service postgresql restart

Tải lại nên hoạt động theo cách sau:

pg_ctl reload

nhưng lệnh có thể khác nhau tùy theo cấu hình PATH - bạn có thể phải chỉ định đường dẫn tuyệt đối, có thể khác nhau, tùy thuộc vào cách cài đặt postgres.

Sau đó, bạn có thể sử dụng:

psql -h localhost -U user -d database

để đăng nhập với điều đó userđể chỉ định databasequa TCP / IP. md5là viết tắt của mật khẩu được mã hóa, trong khi bạn cũng có thể chỉ định passwordmật khẩu văn bản đơn giản trong khi ủy quyền. Hai tùy chọn này không phải là vấn đề lớn miễn là máy chủ cơ sở dữ liệu chỉ có thể truy cập cục bộ, không có quyền truy cập mạng.

Lưu ý quan trọng: Thứ tự định nghĩa trong pg_hba.confcác vấn đề - quy tắc được đọc từ trên xuống dưới, như iptables, vì vậy bạn có thể muốn thêm các quy tắc được đề xuất bên trên quy tắc:

host    all             all             127.0.0.1/32            ident

lại lưu ý quan trọng: - đơn hàng rất quan trọng +1
hawkeye

23

Mặc dù câu trả lời của @ flaviodesousa sẽ hoạt động, nhưng nó cũng bắt buộc tất cả người dùng (mọi người khác) phải nhập mật khẩu.

Đôi khi nó có ý nghĩa để giữ xác thực ngang hàng cho những người khác, nhưng tạo một ngoại lệ cho người dùng dịch vụ. Trong trường hợp đó, bạn sẽ muốn thêm một dòng vào pg_hba.conf trông giống như:

local   all             some_batch_user                         md5

Tôi khuyên bạn nên thêm dòng này ngay bên dưới dòng tiêu đề được nhận xét:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

Bạn sẽ cần phải khởi động lại PostgreSQL bằng cách sử dụng

sudo service postgresql restart

Nếu bạn đang sử dụng 9.3, pg_hba.conf của bạn rất có thể là:

/etc/postgresql/9.3/main/pg_hba.conf


12

Điều này làm việc cho tôi khi tôi gặp phải nó:

sudo -u username psql

chỉ hoạt động nếu bạn tạo một người dùng hoàn toàn mới trên hệ thống VÀ trong postgres - hsming chỉ muốn kết nối với postgres với người dùng postgres mới được tạo , dev.
Kenneth

8

Giải pháp đơn giản nhất:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;

6

Tôi chỉ cần thêm -h localhost


Vấn đề của tôi là sử dụng postgres trên Raspberry. ^^ ^ Làm việc cho tôi !! Cảm ơn bạn!
tidydee

2

Trong trường hợp của tôi, tôi đã sử dụng cổng khác nhau. Mặc định là 5432. Tôi đã sử dụng 5433. Điều này làm việc cho tôi:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433

Điều này có thể xảy ra tự động khi bạn có nhiều hơn một lần cài đặt postgres.
Galigator

1

Đối với những người trong tương lai nhìn thấy điều này, postgreslà trong/usr/lib/postgresql/10/bin máy chủ Ubuntu của tôi.

Tôi đã thêm nó vào PATH trong tệp .bashrc của mình và thêm dòng này vào cuối

PATH=$PATH:/usr/lib/postgresql/10/bin

sau đó trên dòng lệnh

$> source ./.bashrc

Tôi làm mới môi trường bash của tôi. Bây giờ tôi có thể sử dụng postgres -D /wherevertừ bất kỳ thư mục


1

pg_dump -h localhost -U postgres -F c -b -v -f mydb.backup mydb


Câu hỏi nào trả lời? Tại sao có thể -U postgreslà then chốt? Tất cả những chữ cái này là gì?
greybeard

0

Thử:

cơ sở dữ liệu psql -U vai trò -d -h hostname..com -W


Vui lòng thêm một chút bối cảnh để bạn trả lời.
Death Waltz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.