MySQL identyfikuje użytkownika za pomocą ZARÓWNO nazwy użytkownika, jak i hosta. Kiedy MySQL przeprowadza uwierzytelnianie podczas logowania, MySQL najpierw szuka nazwy hosta, która jest dokładnie dopasowana. Jeśli nie znajdzie dokładnego dopasowania, szuka hosta zawierającego symbol wieloznaczny „%”.
Kiedy wykonałeś GRANT ... TO [email protected]
, MySQL utworzył nowego użytkownika (bez hasła, ponieważ nie było IDENTIFIED BY
podane w oświadczeniu.
Co się stało, gdy próbowałeś zalogować się jako myuser
z lokalnego hosta mysqld próbował znaleźć wpis pasujący do 'myuser'@'localhost'
w tabeli mysql.user i znalazł go. Sesja otrzymała uprawnienia przypisane do tego użytkownika.
(Aby być bardziej precyzyjnym, mysqld tak naprawdę nie patrzy na zawartość tabeli mysql.user, na strukturę in-memory, która została zapełniona z tabeli podczas jej budowania. struktura pamięci jest wyzwalana przez polecenie GRANT, REVOKE lub FLUSH PRIVILEGES).
Co się działo PRZED dodaniem nowego użytkownika, mysqld szukał dokładnego dopasowania użytkownika i nazwy hosta i nie znalazł żadnego. Ale znalazł wpis z symbolem wieloznacznym „%”, więc pasował do tego, więc sesja uzyskała wszystkie uprawnienia przyznane użytkownikowi „myuser”@„%”.
Dwóch użytkowników 'u'@'%'
i 'u'@'localhost'
są oddzielone i różne od siebie. Uprawnienia należy przyznać każdemu użytkownikowi indywidualnie. Wszelkie uprawnienia przyznane 'u'@'%'
stosuje się TYLKO do tego użytkownika, a NIE do 'u'@'localhost'
.