Permitindo acesso curinga (%) no MySQL db, obtendo o erro "acesso negado para '<usuário>' @ 'localhost'"

16

Criei um banco de dados e um usuário e permiti o acesso através do seguinte:

create user 'someuser'@'%' identified by 'password';
grant all privileges on somedb.* to 'someuser' with grant option;

no entanto, quando tento conectar-me ao MySQL, recebo o seguinte erro:

$ mysql -u someuser -p
> Enter Password:
> ERROR 1045 (28000): Access denied for user 'someuser'@'localhost' (using password: YES)

Se "%" for o curinga, também não habilitaria o host local? No entanto, se eu não especificar que quero usar uma senha, posso conectar-me perfeitamente ao banco de dados, o que não faz sentido, porque estou especificando uma senha quando criei o usuário.

Wayne Molina
fonte

Respostas:

16

Tente se conectar com mysql -u someuser -p -h 127.0.0.1.

Se você pode se conectar sem uma senha, salvou credenciais em um arquivo .my.cnf ou criou uma conta que permite o acesso sem uma senha.


Este comentário dos documentos do mysql também pode estar relacionado.

http://dev.mysql.com/doc/refman/5.1/en/access-denied.html

Se você não conseguir descobrir por que o acesso é negado, remova da tabela de usuários todas as entradas que possuam valores de host contendo curingas (entradas que contêm caracteres '%' ou '_'). Um erro muito comum é inserir uma nova entrada com Host = '%' e Usuário = 'some_user', pensando que isso permite especificar host local para conectar-se a partir da mesma máquina. O motivo disso não funcionar é que os privilégios padrão incluem uma entrada com Host = 'localhost' e Usuário = ''. Como essa entrada possui um valor de host 'localhost' mais específico que '%', é usada preferencialmente à nova entrada ao se conectar a partir do localhost! O procedimento correto é inserir uma segunda entrada com Host = 'localhost' e Usuário = 'some_user',

Zoredache
fonte
+1 incluindo definição de host e referência ~ / .my.cnf
Andy
7

Tenho certeza de que você precisa do seguinte:

conceda todos os privilégios no somedb. * para 'someuser' @ '%' com opção de concessão;

Sua instrução GRANT não possui uma declaração de nome de host.

Asinine Monkey
fonte
Um local deve ser especificado:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
terça
6

Se você não conseguir se conectar ao mysql usando someuser @ '%' em que '%' é o caractere curinga do nome do host, verifique se você não possui a entrada '' @localhost em sua tabela de usuários. Confirme usando a seguinte instrução SQL:

    mysql> SELECT * FROM user WHERE user='' AND host='localhost';

Se '' @localhost estiver existente, remova-o emitindo a seguinte instrução SQL:

    mysql> DELETE FROM user WHERE user='' AND host='localhost';

então finalmente

    FLUSH PRIVILEGES;

Agora someuser @ '%' se conectará ao banco de dados.

Alphonse Ogulla
fonte
A concessão de privilégios 'nome de usuário' @ 'localhost' não fará com que as concessões ao mesmo usuário de um local diferente não funcionem.
tacotuesday
como isso é relevante? o que o usuário '' em 'localhost' causa?
Steve Buzonas
1
@SteveBuzonas Isso é absolutamente relevante. Ele fornece um exemplo de código para a resposta que o Zoredache postou. Localhost é mais específico que '%'; portanto, se você tentar se conectar via localhost com um usuário que tenha acesso apenas em '%', a entrada localhost será mais específica; portanto, o mysql tentará efetuar login no localhost, mas espera um nome de usuário vazio e senha vazia. Como essas não são as credenciais fornecidas, você obtém o erro de acesso negado. Ao remover essas entradas, ele permite acesso aos usuários em '%'.
bstakes
@bsta adota o comportamento padrão do cliente mysql é usar seu nome de usuário do shell se você não especificar um. a pergunta tem um usuário no exemplo e na mensagem de erro. Fiquei curioso para saber como um usuário '' entraria em conflito com um usuário nomeado. é um curinga?
Steve Buzonas
@SteveBuzonas '' está funcionando como um curinga em relação ao host local. No MySQL Docs e mostrado na resposta acima, referenciando o padrão que você mencionou: "Como essa entrada possui um valor de host 'localhost' que é mais específico que '%', é usado preferencialmente à nova entrada ao se conectar a partir do localhost ! O procedimento correto é inserir uma segunda entrada com Host = 'localhost' e Usuário = 'some_user' ou excluir a entrada com Host = 'localhost' e Usuário = ''. "
bstakes
4

Meu entendimento, e estou preparado para ser corrigido, é que o MySQL trata o host local separadamente para%. ou seja, localhost não está incluído no curinga.

John Gardeniers
fonte
Os exemplos fornecidos em dev.mysql.com/doc/refman/5.1/en/connection-access.html me levam a acreditar que isso pode não ser exato. Você tem referências de outra forma?
Warner
Minha compreensão desse assunto é baseada em outras pessoas que relatam o mesmo problema, tanto na impressão quanto na verbal, e resolvem-no criando 2 usuários, usando o "%" e o "localhost". Não me lembro de ter visto oficialmente documentado.
John Gardeniers
1
Isso parece estar correto no Ubuntu 12.04 LTS, pelo menos #
314 Dex
O que aconteceu comigo é que eu tinha user@%e não funcionou até eu incluir user@localhost. Então eu vi a resposta stackoverflow.com/a/29421084/4850646 e percebi que tinha um usuário anônimo com host localhost. Eu removi todos os usuários anônimos e consegui acessar a partir localhostdesse usuário, mesmo depois de remover user@localhost (e deixar apenas user@%). Parece que, por localhostser mais específico do que %, tenta primeiro o localhostusuário, mesmo que seja um usuário anônimo!
Lucas Basquerotto 16/05/19
0

Você correu flush privileges;depois de criar o usuário? Caso contrário, as alterações nos usuários / permissões não serão necessárias até que o servidor seja reiniciado.

Em seguida, verifique se você não possui uma entrada '%' @ 'localhost'.

caelyx
fonte
4
usando 'criar usuário' e 'conceder' libera automaticamente os privilégios. Você só precisa liberar privilégios se estiver manipulando diretamente o banco de dados mysql.
Zoredache