Erlaube Wildcard (%) Zugriff auf MySQL Datenbank und erhalte die Fehlermeldung "Zugriff verweigert für '<Benutzer>' @ 'localhost'"

16

Ich habe eine Datenbank und einen Benutzer erstellt und folgenden Zugriff gewährt:

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

Wenn ich jedoch versuche, eine Verbindung zu MySQL herzustellen, wird der folgende Fehler angezeigt:

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

Wenn "%" der Platzhalter ist, wird dann nicht auch localhost aktiviert? Wenn ich jedoch nicht spezifiziere, dass ich ein Passwort verwenden möchte, kann ich eine gute Verbindung zur Datenbank herstellen, was keinen Sinn ergibt, da ich bei der Erstellung des Benutzers ein Passwort spezifiziere.

Wayne Molina
quelle

Antworten:

16

Versuchen Sie, eine Verbindung mit herzustellen mysql -u someuser -p -h 127.0.0.1.

Wenn Sie eine Verbindung ohne Kennwort herstellen können, haben Sie entweder Anmeldeinformationen in einer .my.cnf-Datei gespeichert oder ein Konto erstellt, das den Zugriff ohne Kennwort ermöglicht.


Dieser Kommentar aus den MySQL-Dokumenten kann auch verwandt sein.

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

Wenn Sie nicht herausfinden können, warum Ihnen der Zugriff verweigert wird, entfernen Sie alle Einträge aus der Benutzertabelle, deren Host-Werte Platzhalter enthalten (Einträge, die Zeichen '%' oder '_' enthalten). Ein sehr häufiger Fehler ist das Einfügen eines neuen Eintrags mit Host = '%' und User = 'some_user', da Sie hiermit localhost angeben können, um eine Verbindung von demselben Computer aus herzustellen. Der Grund, warum dies nicht funktioniert, ist, dass die Standardberechtigungen einen Eintrag mit Host = 'localhost' und User = '' enthalten. Da dieser Eintrag einen Host-Wert 'localhost' hat, der spezifischer als '%' ist, wird er beim Herstellen einer Verbindung von localhost aus dem neuen Eintrag vorgezogen! Die korrekte Vorgehensweise besteht darin, einen zweiten Eintrag mit Host = 'localhost' und User = 'some_user' einzufügen.

Zoredache
quelle
+1 einschließlich Host-Definition & ~ / .my.cnf Referenz
Andy
7

Ich bin mir ziemlich sicher, dass Sie Folgendes brauchen:

Gewähren Sie 'someuser' @ '%' mit der Option grant alle Berechtigungen für somedb. *.

Ihrer GRANT-Anweisung fehlt eine Deklaration für den Hostnamen.

Asinine Monkey
quelle
Ein Ort sollte angegeben werden:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
Dienstag,
6

Wenn Sie mit someuser @ '%' keine Verbindung zu mysql herstellen können, wobei '%' der Platzhalter für den Hostnamen ist, stellen Sie sicher, dass in Ihrer Benutzertabelle kein '' @localhost-Eintrag vorhanden ist. Bestätigen Sie mit der folgenden SQL-Anweisung:

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

Wenn '' @localhost vorhanden ist, entfernen Sie es, indem Sie die folgende SQL-Anweisung absetzen:

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

dann endlich

    FLUSH PRIVILEGES;

Jetzt stellt someuser @ '%' eine Verbindung zur Datenbank her.

Alphonse Ogulla
quelle
Das Erteilen von "Benutzername" @ "localhost" -Privilegien führt nicht dazu, dass Berechtigungen für denselben Benutzer von einem anderen Standort nicht funktionieren.
Dienstag,
Wie ist das relevant? Was bewirkt der Benutzer bei localhost?
Steve Buzonas
1
@SteveBuzonas Dies ist absolut relevant. Es enthält ein Codebeispiel für die Antwort, die Zoredache veröffentlicht hat. Localhost ist spezifischer als '%'. Wenn Sie also versuchen, über localhost eine Verbindung mit einem Benutzer herzustellen, der nur über '%' Zugriff hat, ist der localhost-Eintrag spezifischer, sodass mysql versucht, sich bei localhost anzumelden, aber einen leeren Benutzernamen und erwartet leeres Passwort. Da dies nicht die angegebenen Anmeldeinformationen sind, wird der Fehler "Zugriff verweigert" angezeigt. Durch Entfernen dieser Einträge wird Benutzern der Zugriff unter '%' ermöglicht.
bstakes
@bstakes Das Standardverhalten des MySQL-Clients besteht darin, Ihren Shell-Benutzernamen zu verwenden, wenn Sie keinen angeben. Die Frage hat einen Benutzer im Beispiel und in der Fehlermeldung. Ich war neugierig, wie ein Benutzer mit einem benannten Benutzer in Konflikt geraten würde. ist '' eine Wildcard?
Steve Buzonas
@SteveBuzonas '' funktioniert in Bezug auf localhost wie ein Platzhalter. In den MySQL-Dokumenten und in der obigen Antwort unter Bezugnahme auf die von Ihnen erwähnte Standardeinstellung: "Da dieser Eintrag einen Host-Wert 'localhost' hat, der spezifischer als '%' ist, wird er vor dem neuen Eintrag verwendet, wenn eine Verbindung von localhost hergestellt wird Die korrekte Vorgehensweise ist, einen zweiten Eintrag mit Host = 'localhost' und User = 'some_user' einzufügen oder den Eintrag mit Host = 'localhost' und User = '' zu löschen. "
bstakes
4

Mein Verständnis, und ich bin bereit, dies zu korrigieren, ist, dass MySQL localhost getrennt von% behandelt. Das heißt, localhost ist nicht im Platzhalter enthalten.

John Gardeniers
quelle
Die Beispiele in dev.mysql.com/doc/refman/5.1/en/connection-access.html lassen mich vermuten , dass dies möglicherweise nicht korrekt ist. Haben Sie sonst Referenzen?
Warner
Mein Verständnis für diese Angelegenheit basiert darauf, dass andere das gleiche Problem sowohl in gedruckter als auch in mündlicher Form melden und es beheben, indem 2 Benutzer mit "%" und "localhost" erstellt werden. Ich kann mich nicht erinnern, es jemals offiziell dokumentiert gesehen zu haben.
John Gardeniers
1
Dies scheint zumindest auf Ubuntu 12.04 LTS korrekt zu sein
Dex
Was mir passiert ist, ist, dass ich hatte user@%und es hat nicht funktioniert, bis ich aufgenommen habe user@localhost. Dann sah ich die Antwort stackoverflow.com/a/29421084/4850646 und stellte fest, dass ich einen anonymen Benutzer mit Host hatte localhost. Ich habe alle anonymen Benutzer entfernt und konnte von localhostdiesem Benutzer aus auch nach dem Entfernen user@localhost (und nur nach dem Vermieten user@%) darauf zugreifen . Es scheint, dass, weil localhostes spezifischer als ist %, es zuerst den localhostBenutzer versucht , auch wenn es ein anonymer Benutzer ist!
Lucas Basquerotto
0

Haben Sie flush privileges;nach dem Erstellen des Benutzers ausgeführt? Andernfalls werden Änderungen an Benutzern / Berechtigungen erst nach einem Neustart des Servers wirksam.

Überprüfen Sie dann, ob Sie keinen '%' @ 'localhost'-Eintrag haben.

caelyx
quelle
4
Wenn Sie "Benutzer erstellen" und "Gewähren" verwenden, werden die Berechtigungen automatisch gelöscht. Sie sollten nur dann Berechtigungen löschen müssen, wenn Sie die mysql-Datenbank direkt bearbeiten.
Zoredache