Дозволення доступу до підстановки (%) на MySQL db, отримання помилки "відмовлено у доступі для '<user>' @ 'localhost'"


17

Я створив базу даних та користувача та дозволив доступ через:

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? Однак, якщо я не вказую, що хочу використовувати пароль, я можу підключитися до бази даних просто чудово, що не має сенсу, оскільки я вказую пароль під час створення користувача.

Відповіді:


17

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

Якщо ви можете підключитися без пароля, ви зберегли облікові дані в .my.cnf або створили обліковий запис, який дозволяє отримати доступ без пароля.


Цей коментар із докулів mysql також може бути пов’язаний.

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

Якщо ви не можете зрозуміти, чому вам заборонено доступ, видаліть із таблиці користувачів усі записи, що містять знаки хосту, що містять символи підстановки (записи, що містять символи '%' або '_'). Дуже поширеною помилкою є вставка нового запису з Host = '%' та User = 'some_user', думаючи, що це дозволяє вказати localhost для підключення з тієї ж машини. Причина, що це не працює, полягає в тому, що привілеї за замовчуванням включають запис із Host = 'localhost' та User = ''. Оскільки цей запис має значення хосту 'localhost', яке є більш конкретним, ніж '%', воно використовується в перевазі нового запису при підключенні з localhost! Правильна процедура полягає в тому, щоб вставити другий запис з Host = 'localhost' і User = 'some_user',


+1, включаючи визначення хосту & ~ / .my.cnf
Енді

7

Я впевнений, що вам потрібно наступне:

надати всі привілеї на somedb. * на 'someuser' @ '%' з опцією надання;

У вашому операторі GRANT відсутні декларація імені хоста.


Місце має бути вказано:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
вівторок

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 @ '%' підключиться до бази даних.


Надання привілеїв "ім'я користувача" @ "localhost" не призведе до того, що гранти для одного користувача з іншого місця розташування не працюватимуть.
такотутор

як це актуально? що викликає "" користувача в "localhost"?
Стів Бузонас

1
@SteveBuzonas Це абсолютно актуально. Він надає приклад коду для відповіді, яку розмістив Zoredache. Localhost є більш конкретним, ніж "%", тому якщо ви намагаєтесь з'єднатися через localhost з користувачем, який має доступ лише у "%", запис localhost є більш конкретним, тому mysql намагається увійти в localhost, але очікує, що порожнє ім'я користувача та порожній пароль. Оскільки це не надані облікові дані, ви отримуєте помилку в доступі. Видаляючи ці записи, він дозволяє отримувати доступ для користувачів на "%".
ставки

@bstakes поведінка клієнта mysql за замовчуванням полягає у використанні вашого імені користувача оболонки, якщо ви не вказали його. запитання має користувач у прикладі та у повідомленні про помилку. Мені було цікаво, як користувач '' конфліктуватиме з названим користувачем. це '' wildcard?
Стів Бузонас

@SteveBuzonas '' працює як підстановка по відношенню до localhost. З Документів MySQL, наведених у відповіді вище, з посиланням на типовий згаданий вами типовий параметр: "Оскільки цей запис має значення хосту" localhost ", яке є більш конкретним, ніж"% ", воно використовується в перевазі нового запису при підключенні з localhost Правильна процедура полягає в тому, щоб вставити другий запис з Host = 'localhost' і User = 'some_user', або видалити запис з Host = 'localhost' і User = ''. "
ставки

4

Моє розуміння, і я готовий виправити це, полягає в тому, що MySQL розглядає localhost окремо до%. тобто localhost не включений у підстановку.


Наведені приклади в dev.mysql.com/doc/refman/5.1/en/connection-access.html приводять мене до думки, що це може бути неточним. У вас є посилання інакше?
Warner

Моє розуміння цього питання ґрунтується на тому, що інші люди повідомляють про ту саму проблему, як у друкованому, так і усному вигляді та вирішують її, створюючи 2 користувачів, використовуючи "%" та "localhost". Я не можу пригадати, щоб ніколи насправді це було офіційно задокументовано.
John Gardeniers

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".


4
використання 'create user' та 'grant' автоматично відмиває привілеї. Ви повинні очищати привілеї, лише якщо ви безпосередньо маніпулюєте базою даних mysql.
Зоредаче
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.