Zezwalanie na dostęp za pomocą symboli wieloznacznych (%) do bazy danych MySQL, pojawia się błąd „odmowa dostępu dla„ <użytkownik> ”@„ localhost ””


17

Utworzyłem bazę danych i użytkownika i zezwoliłem na dostęp poprzez:

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

jednak przy próbie połączenia z MySQL pojawia się następujący błąd:

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

Jeśli „%” jest symbolem wieloznacznym, to czy nie włączy również hosta lokalnego? Jeśli jednak nie określę, że chcę użyć hasła, mogę połączyć się z bazą danych w porządku, co nie ma sensu, ponieważ określam hasło podczas tworzenia użytkownika.

Odpowiedzi:


17

Spróbuj połączyć się z mysql -u someuser -p -h 127.0.0.1.

Jeśli możesz połączyć się bez hasła, możesz zapisać dane uwierzytelniające w pliku .my.cnf lub utworzyć konto, które umożliwia dostęp bez hasła.


Ten komentarz z mysql docs może być również powiązany.

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

Jeśli nie możesz zrozumieć, dlaczego odmawiasz dostępu, usuń z tabeli użytkowników wszystkie wpisy, które mają wartości hosta zawierające symbole wieloznaczne (wpisy zawierające znaki „%” lub „_”). Bardzo częstym błędem jest wstawianie nowego wpisu za pomocą Host = '%' i User = 'some_user', sądząc, że pozwala to określić localhost do połączenia z tego samego komputera. Nie działa to dlatego, że domyślne uprawnienia obejmują wpis z Host = „localhost” i User = ''. Ponieważ ten wpis ma wartość Hosta „localhost”, która jest bardziej szczegółowa niż „%”, jest on używany zamiast nowego wpisu podczas łączenia się z localhost! Prawidłowa procedura polega na wstawieniu drugiego wpisu z Host = „localhost” i User = 'some_user',


+1 łącznie z definicją hosta i ~ / .my.cnf
Andy

7

Jestem pewien, że potrzebujesz:

przyznaj wszystkie uprawnienia na somedb. * do 'someuser' @ '%' z opcją grant;

W wyciągu GRANT brakuje deklaracji nazwy hosta.


Należy podać lokalizację:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
tacot wtorek

6

Jeśli nie możesz połączyć się z mysql za pomocą użytkownika @ '%', gdzie '%' jest symbolem wieloznacznym nazwy hosta, upewnij się, że nie masz wpisu @localhost w tabeli użytkowników. Potwierdź za pomocą następującej instrukcji SQL:

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

Jeśli istnieje „@localhost”, usuń go, wydając następującą instrukcję SQL:

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

potem w końcu

    FLUSH PRIVILEGES;

Teraz someuser @ '%' połączy się z bazą danych.


Przyznanie uprawnień „nazwa użytkownika” @ „localhost” nie spowoduje, że granty dla tego samego użytkownika z innej lokalizacji nie będą działać.
tacot wtorek

jak to jest istotne? co powoduje użytkownik „localhost”?
Steve Buzonas

1
@SteveBuzonas Jest to absolutnie istotne. Podaje przykładowy kod dla odpowiedzi opublikowanej przez Zoredache. Localhost jest bardziej szczegółowy niż „%”, więc jeśli spróbujesz połączyć się przez localhost z użytkownikiem, który ma dostęp tylko na „%”, wpis localhost jest bardziej szczegółowy, więc mysql próbuje się zalogować na localhost, ale oczekuje pustej nazwy użytkownika i puste hasło. Ponieważ nie są to dane uwierzytelniające, pojawia się błąd odmowy dostępu. Usuwając te wpisy, umożliwia dostęp użytkownikom na poziomie „%”.
bstakes

@bstakes domyślnym zachowaniem klienta mysql jest użycie nazwy użytkownika powłoki, jeśli jej nie określisz. pytanie ma użytkownika w przykładzie i komunikacie o błędzie. Byłem ciekawy, w jaki sposób użytkownik „” może kolidować z nazwanym użytkownikiem. jest symbolem wieloznacznym?
Steve Buzonas,

@SteveBuzonas '' działa jak symbol wieloznaczny w odniesieniu do localhost. Z dokumentów MySQL i pokazanych w powyższej odpowiedzi odnoszącej się do wspomnianej wartości domyślnej: „Ponieważ ten wpis ma wartość Hosta„ localhost ”, która jest bardziej szczegółowa niż„% ”, jest on używany zamiast nowego wpisu podczas łączenia się z localhost ! Prawidłowa procedura polega na wstawieniu drugiego wpisu za pomocą Host = 'localhost' i User = 'some_user' lub usunięciu wpisu za pomocą Host = 'localhost' i User = ''. ”
bstakes

4

Rozumiem i jestem przygotowany na to, że MySQL traktuje localhost osobno do%. tzn. localhost nie jest ujęty w symbol wieloznaczny.


Przykłady podane w dev.mysql.com/doc/refman/5.1/en/connection-access.html pozwalają mi sądzić, że może to nie być dokładne. Czy masz inne referencje?
Warner

Moje rozumienie tej kwestii opiera się na tym, że inni zgłaszają ten sam problem, zarówno w formie drukowanej, jak i ustnej, i rozwiązują go, tworząc 2 użytkowników, używając „%” i „localhost”. Nie przypominam sobie, żeby kiedykolwiek widziałem to oficjalnie udokumentowane.
John Gardeniers,

1
Wydaje się, że jest to poprawne przynajmniej na Ubuntu 12.04 LTS
Dex

To, co mi się przydarzyło, to to, że miałem user@%i nie działało, dopóki nie włączyłem user@localhost. Potem zobaczyłem odpowiedź stackoverflow.com/a/29421084/4850646 i zdałem sobie sprawę, że mam anonimowego użytkownika z hostem localhost. Usunąłem wszystkich anonimowych użytkowników i mogłem uzyskać do nich dostęp localhost, nawet po usunięciu user@localhost (i tylko pozwoleniu user@%). Wydaje się, że ponieważ localhostjest bardziej konkretny %, najpierw próbuje localhostużytkownika, nawet jeśli jest to użytkownik anonimowy!
Lucas Basquerotto

0

Czy działałeś flush privileges;po utworzeniu użytkownika? Jeśli tego nie zrobisz, zmiany w użytkownikach / uprawnieniach zostaną wprowadzone dopiero po ponownym uruchomieniu serwera.

Następnie sprawdź, czy nie masz wpisu „%” @ „localhost”.


4
użycie „Utwórz użytkownika” i „Przyznaj” automatycznie usuwa uprawnienia. Musisz tylko opróżnić uprawnienia, jeśli bezpośrednio manipulujesz bazą danych mysql.
Zoredache,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.