Разрешение подстановочного (%) доступа к базе данных MySQL, получение ошибки «доступ запрещен для« <user> »@« localhost »»

16

Я создал базу данных и пользователя и разрешил доступ через следующее:

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

Однако, когда я пытаюсь подключиться к MySQL, я получаю следующую ошибку:

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

Если «%» является подстановочным знаком, то не будет ли он также включать localhost? Однако, если я не укажу, что хочу использовать пароль, тогда я могу просто отлично подключиться к базе данных, что не имеет смысла, потому что я указываю пароль при создании пользователя.

Уэйн Молина
источник

Ответы:

16

Попробуйте связаться с mysql -u someuser -p -h 127.0.0.1.

Если вы можете подключиться без пароля, либо вы сохранили учетные данные в .my.cnf, либо создали учетную запись, которая разрешает доступ без пароля.


Этот комментарий из документации MySQL также может быть связан.

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

Если вы не можете понять, почему вы получаете отказ в доступе, удалите из пользовательской таблицы все записи, в которых значения хоста содержат подстановочные знаки (записи, содержащие символы «%» или «_»). Очень распространенная ошибка - вставить новую запись с Host = '%' и User = 'some_user', полагая, что это позволяет указать localhost для подключения с той же машины. Причина, по которой это не работает, заключается в том, что привилегии по умолчанию включают запись с Host = 'localhost' и User = ''. Поскольку эта запись имеет значение Host «localhost», которое является более конкретным, чем «%», она используется в предпочтении новой записи при подключении с localhost! Правильная процедура - вставить вторую запись с Host = 'localhost' и User = 'some_user',

Zoredache
источник
+1, включая определение хоста & ~ / .my.cnf reference
Andy
7

Я уверен, что вам нужно следующее:

предоставить все привилегии для somedb. * для 'someuser' @ '%' с опцией grant;

В вашем выражении GRANT отсутствует объявление имени хоста.

Asinine Monkey
источник
Место должно быть указано:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
tacotuesday
6

Если вы не можете подключиться к mysql, используя someuser @ '%', где '%' - это подстановочный знак для имени хоста, убедитесь, что у вас нет записи '' @localhost в вашей пользовательской таблице. Подтвердите, используя следующую инструкцию SQL:

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

Если '' @localhost существует, удалите его, введя следующую инструкцию SQL:

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

затем, наконец,

    FLUSH PRIVILEGES;

Теперь someuser @ '%' подключится к базе данных.

Альфонс Огулла
источник
Предоставление привилегий 'username' @ 'localhost' не приведет к тому, что гранты одного и того же пользователя из другого места не будут работать.
Tacotuesday
как это актуально? что вызывает пользователь в localhost?
Стив Бузонас
1
@SteveBuzonas Это абсолютно актуально. Он предоставляет пример кода для ответа, который опубликовал Zoredache. Localhost более специфичен, чем «%», поэтому, если вы пытаетесь соединиться через localhost с пользователем, который имеет доступ только к «%», запись localhost более конкретна, поэтому mysql пытается войти в систему с localhost, но ожидает пустое имя пользователя и пустой пароль Так как это не предоставленные учетные данные, вы получаете ошибку отказа в доступе. Удаляя эти записи, он разрешает доступ пользователям на «%».
bstakes
@bstakes стандартное поведение клиента mysql - использовать имя пользователя вашей оболочки, если вы его не указали. вопрос есть пользователь в примере и в сообщении об ошибке. Мне было любопытно, как пользователь может конфликтовать с именованным пользователем. такое подстановочный знак?
Стив Бузонас
@SteveBuzonas '' функционирует как шаблон по отношению к localhost. Из документации MySQL, приведенной выше в ответе на ссылку по умолчанию, которую вы упомянули: «Поскольку эта запись имеет значение Host« localhost », которое является более конкретным, чем«% », она используется в предпочтении новой записи при подключении с localhost ! Правильная процедура - вставить вторую запись с Host = 'localhost' и User = 'some_user' или удалить запись с Host = 'localhost' и User = ''. "
bstakes
4

Насколько я понимаю, и я готов исправить это, MySQL обрабатывает localhost отдельно для%. т.е. localhost не включен в шаблон.

Джон Гарденье
источник
Примеры, представленные на dev.mysql.com/doc/refman/5.1/en/connection-access.html , позволяют мне полагать, что это может быть неточным. Есть ли у вас ссылки в противном случае?
Warner
Мое понимание этого вопроса основано на том, что другие сообщают об одной и той же проблеме, как в печатном, так и в устном виде, и решают ее, создавая 2 пользователей, используя "%" и "localhost". Я не могу вспомнить когда-либо, видя это официально зарегистрировано, хотя.
Джон Гарденерс
1
Это похоже на Ubuntu 12.04 LTS как минимум
Dex
Что случилось со мной, так это то, что у меня было, user@%и это не сработало, пока я не включил user@localhost. Затем я увидел ответ stackoverflow.com/a/29421084/4850646 и понял, что у меня есть анонимный пользователь с хостом localhost. Я удалил всех анонимных пользователей и смог получить доступ localhostдля этого пользователя даже после удаления user@localhost (и только разрешения user@%). Кажется, что поскольку localhostон более конкретен %, он сначала пытается использовать localhostпользователя, даже если это анонимный пользователь!
Лукас Баскеротто
0

Вы запускали flush privileges;после создания пользователя? Если вы этого не сделаете, изменения в пользователях / разрешениях не будут приняты, пока сервер не будет перезапущен.

Затем убедитесь, что у вас нет записи '%' @ 'localhost'.

caelyx
источник
4
использование 'create user' и 'grant' автоматически сбрасывает привилегии. Вам нужно только сбросить привилегии, если вы непосредственно манипулируете базой данных mysql.
Зоредаче