MySQL dbでのワイルドカード(%)アクセスを許可し、「 '<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 = ''のエントリが含まれているためです。そのエントリには '%'よりも具体的なホスト値 'localhost'があるため、localhostから接続するときに新しいエントリよりも優先して使用されます!正しい手順は、Host = 'localhost'およびUser = 'some_user'の2番目のエントリを挿入することです。


ホスト定義と〜/ .my.cnfリファレンスを含む+1
アンディ

7

次のものが必要だと確信しています。

付与オプションを使用して、somedb。*のすべての特権を 'someuser' @ '%'に付与します。

GRANTステートメントにホスト名宣言がありません。


場所を指定する必要があります:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
tacotuesday

6

someuser @ '%'を使用してmysqlに接続できない場合( '%'はホスト名のワイルドカード)、ユーザーテーブルに '' @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 Docsから、前述のデフォルトを参照する上記の回答に示されています:「そのエントリには、 '%'よりも具体的なホスト値 'localhost'があるため、localhostから接続するときに新しいエントリより優先して使用されます!正しい手順は、Host = 'localhost'およびUser = 'some_user'の2番目のエントリを挿入するか、Host = 'localhost'およびUser = ''のエントリを削除することです。 "
bstakes

4

私の理解、およびこれについて修正する準備はできていますが、MySQLはlocalhostを%とは別に扱うということです。つまり、localhostはワイルドカードに含まれません。


dev.mysql.com/doc/refman/5.1/en/connection-access.htmlで提供されている例は、これが正確でないかもしれないと信じさせます。それ以外の参照はありますか?
ワーナー

この問題に対する私の理解は、印刷物と口頭の両方で同じ問題を報告し、「%」と「localhost」を使用して2人のユーザーを作成することで解決する他の人に基づいています。しかし、公式に文書化されたことを実際に思い出すことはできません。
ジョンガーデニアーズ

1
これは、少なくとも、Ubuntuの12.04 LTSに正しいと思わ
Dexの

私に起こったことは私が持っていたことでuser@%あり、それは私が含めuser@localhostたまで働かなかった。それから私は答えstackoverflow.com/a/29421084/4850646を見て、hostの匿名ユーザーがいることに気付きましたlocalhost。すべての匿名ユーザーを削除し、削除(および許可のみ)したlocalhost 、そのユーザーからアクセスできました。ためと思われるよりも具体的であり、それは最初にしようと、ユーザーにそれが匿名ユーザーであっても!user@localhostuser@%localhost%localhost
ルーカスバスケロット

0

flush privileges;ユーザーを作成した後に実行しましたか?そうしないと、サーバーが再起動されるまで、ユーザー/アクセス許可の変更は反映されません。

次に、 '%' @ 'localhost'エントリがないことを確認します。


4
「ユーザーの作成」と「許可」を使用すると、自動的に特権がフラッシュされます。mysqlデータベースを直接操作している場合にのみ、特権をフラッシュする必要があります。
ゾレダチェ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.