psql: FATAL: A autenticação de mesmo nível falhou para o usuário "dev"

198

quando crio um novo usuário, mas ele não pode fazer login no banco de dados.
Eu faço assim:

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

então crie um banco de dados:

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

depois disso, tento psql -U dev -W test_developmentfazer login, mas recebo o erro:

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

Eu tentei resolver o problema, mas falhei.

hsming
fonte
2
possível duplicata de autenticação ponto PG falhou
Daniel Vérité
agora, para ser solicitado a obter respostas para as perguntas acima, você precisa adicionar --interactiveao comando:createuser --interactive joe
user3791372

Respostas:

310

Experimentar:

psql -U user_name  -h 127.0.0.1 -d db_name

Onde

  • -U é o nome de usuário do banco de dados
  • -h é o nome do host / IP do servidor local, evitando soquetes de domínio Unix
  • -d é o nome do banco de dados ao qual se conectar

Isso é avaliado como uma conexão de "rede" pelo Postgresql em vez de uma conexão de soquete de domínio Unix, portanto, não é avaliado como uma conexão "local", como você pode ver em pg_hba.conf:

local   all             all                                     peer
meyerson
fonte
15
Eu precisava (versão 9.4): psql -U nome-do-usuário -h 127.0.0.1 -d db-name
Gregor
9
que ferramenta ordinária. diz o manual psql [option...] [dbname [username]], então você acha que psql dbname usernameseria apenas trabalho ..
djeikyb
2
Trabalhou para mim também. Eu também acho que essa é uma maneira muito mais preferível do que alterar os arquivos de configuração, especialmente quando você não tem idéia do que está fazendo e apenas segue a resposta do SO para resolver seu problema.
borisano
1
isso funcionou para mim, muito obrigado, embora eu esteja fazendo uma pesquisa sobre por que foi a solução correta. no entanto, em uma configuração em outra máquina, eu entraria como psql -U nome de usuário -d banco de dados. então acho que a solução aceita depende do caso.
Lazarus Rising (
2
Boa resposta. Eu estava saindo de dentro do banco de dados depois de ter feito login como postgres e \c glossary john FATAL: Peer authentication failed for user "john"depois \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".funcionou.
veja
215

Sua conexão falhou porque, por padrão, se psqlconecta por soquetes UNIX usando peerautenticação, o que exige que o usuário UNIX atual tenha o mesmo nome de usuário psql. Portanto, você terá que criar o usuário UNIX deve, em seguida, efetuar login como devou usar sudo -u dev psql test_developmentpara acessar o banco de dados (e nãopsql deve solicitar uma senha).

Se você não pode ou não deseja criar o usuário UNIX, como se você deseja apenas conectar-se ao seu banco de dados para consultas ad hoc , forçar uma conexão de soquete usando psql --host=localhost --dbname=test_development --username=dev(conforme indicado pela resposta do @meyerson) resolverá o seu problema imediato.

Mas se você pretende forçar a autenticação de senha nos soquetes Unix em vez do método de mesmo nível, tente alterar a seguinte pg_hba.conflinha *:

de

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

para

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peersignifica que confiará na identidade (autenticidade) do usuário UNIX. Portanto, não solicitando uma senha.

  • md5significa que sempre solicitará uma senha e a validará após fazer o hash com MD5.

Obviamente, você também pode criar regras mais específicas para um banco de dados ou usuário específico, com alguns usuários tendo peere outros exigindo senhas.

Depois de mudar pg_hba.conf se o PostgreSQL está em execução, você precisará reler a configuração recarregando ( pg_ctl reload) ou reiniciando ( sudo service postgresql restart).

* O arquivo pg_hba.conf provavelmente estará em/etc/postgresql/9.x/main/pg_hba.conf

Editado: Comentários de @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_What comentários incorporados na resposta.

flaviodesousa
fonte
5
Como você permite peer AND md5 ? Quando defino md5, não consigo mais fazer login com o postgresusuário! Tentei adicionar várias linhas e separar o método com vírgulas, mas elas não funcionaram. Ok, encontrei mgoldwassera resposta e funcionou. Acabei de adicionar outra linha para o usuário postgrescom o método peer!
Chloe
3
Não se preocupe, você pode definir a autenticação por pares para usuários específicos (por exemplo, seu nome de usuário ou postgres). Parece que as regras específicas substituem as regras gerais
JavierIEH 23/11
1
Em algumas distribuições o arquivo pode também ser encontrada aqui:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher
2
você não pode fazer isso sem reiniciar o postgresql? você não pode simplesmente especificar o método de autenticação na tabela pg_user?
Fccoelho
2
Você pode recarregar em vez de reiniciar. Isso recarrega a tabela pg_hba. Trabalhou para mim.
Joanis
29

Autenticação por pares significa que o postgres solicita ao sistema operacional seu nome de login e o utiliza para autenticação. Para efetuar login como usuário "dev" usando autenticação de mesmo nível no postgres, você também deve ser o usuário "dev" no sistema operacional.

Você pode encontrar detalhes sobre os métodos de autenticação na documentação do Postgresql .

Dica: Se nenhum método de autenticação funcionar mais, desconecte o servidor da rede e use o método "trust" para "localhost" (e verifique novamente se o servidor não está acessível pela rede enquanto o método "trust" estiver ativado).

stefan.schwetschke
fonte
1
obrigado pela sua answers.but ainda não funcionam se eu mudar o devpara o usuário do sistemaXXX
hsming
2
a resposta de stefan está correta. Acabei de adicionar um link, que ficará visível quando minha edição for revisada, na documentação em que cada um dos métodos de autenticação é explicado.
dsh
25

Quando você especifica:

psql -U user

ele se conecta via soquete UNIX, que por padrão usa peerautenticação, a menos que especificado de pg_hba.confoutra forma.

Você pode especificar:

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

para obter uma conexão TCP / IP na interface de loopback (IPv4 e IPv6) para as especificações databasee user.

Após as alterações, você deve reiniciar o postgres ou recarregar sua configuração. Reinicie que deve funcionar em distros modernos baseados em RHEL / Debian:

service postgresql restart

Recarregar deve funcionar da seguinte maneira:

pg_ctl reload

mas o comando pode diferir dependendo da configuração do PATH - você pode precisar especificar o caminho absoluto, que pode ser diferente, dependendo da maneira como o postgres foi instalado.

Então você pode usar:

psql -h localhost -U user -d database

para fazer login com o userespecificado databaseem TCP / IP. md5significa senha criptografada, enquanto você também pode especificarpassword senhas em texto sem formatação durante a autorização. Essas 2 opções não devem ser muito importantes, desde que o servidor de banco de dados seja acessível apenas localmente, sem acesso à rede.

Nota importante: a ordem das definições é pg_hba.confimportante - as regras são lidas de cima para baixo, como o iptables; portanto, você provavelmente deseja adicionar regras propostas acima da regra:

host    all             all             127.0.0.1/32            ident
tymik
fonte
re a nota importante: - a ordem é importante +1
hawkeye
23

Embora a resposta de @ flaviodesousa funcione, também torna obrigatório que todos os usuários (todos os outros) insiram uma senha.

Em algum momento, faz sentido manter a autenticação de colegas para todos os outros, mas abre uma exceção para um usuário do serviço. Nesse caso, você deseja adicionar uma linha ao pg_hba.conf que se parece com:

local   all             some_batch_user                         md5

Eu recomendo que você adicione esta linha logo abaixo da linha do cabeçalho comentada:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

Você precisará reiniciar o PostgreSQL usando

sudo service postgresql restart

Se você estiver usando o 9.3, seu pg_hba.conf provavelmente será:

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

mgoldwasser
fonte
12

Isso funciona para mim quando eu o encontro:

sudo -u username psql
alangrah
fonte
só funciona se você criar um novo usuário no sistema E no postgres - o hsming apenas deseja se conectar ao postgres com o novo usuário do postgres dev,.
30915 Kenneth
8

A solução mais fácil:

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

Eu simplesmente tive que adicionar -h localhost

VPaul
fonte
Meu problema foi usar o postgres em um Raspberry. ^^^ funcionou para mim !! Obrigado!
Tidydee
2

No meu caso, eu estava usando uma porta diferente. O padrão é 5432. Eu estava usando 5433. Isso funcionou para mim:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433
Ikrom
fonte
Isso pode ocorrer automaticamente quando você possui mais de uma instalação do postgres.
Galigator 30/10
1

Para as pessoas no futuro vendo isso, postgresestá no /usr/lib/postgresql/10/binmeu servidor Ubuntu.

Adicionei-o ao PATH no meu arquivo .bashrc e adicione esta linha no final

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

então na linha de comando

$> source ./.bashrc

Atualizei meu ambiente do bash. Agora eu posso usar postgres -D /whereverde qualquer diretório

Tyler Curtis Jowers
fonte
1

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

Dmitry Shilin
fonte
Que pergunta isso responde? Por que pode -U postgresser crucial? O que são todas essas cartas de traço , afinal?
greybeard 19/04
0

Experimentar:

psql -U role_name -d banco de dados -h hostname..com -W

Srinu Mareti
fonte
Por favor, adicione um pouco mais de contexto à sua resposta.
Death Waltz