14

私の PHP スクリプトでは、2 つのデータベースdb1db2. myuser@localhostにアクセスできるがアクセスできないユーザーdb1がいますdb2

テーブルから選択する場合mysql.user、1 つのレコードがあり、そのユーザーのホストはワイルドカード%であり、ホストはありませんlocalhost

SELECT user, host FROM mysql.user WHERE user = 'myuser'; ください:

+------------+------+
| user       | host |
+------------+------+
| myuser     | %    |
+------------+------+
1 row in set (0.00 sec)

そのユーザーの GRANTS を見るとdb1db2

SHOW GRANTS FOR 'myuser'@'%';

+-----------------------------------------------------------------------------------------------------------+
| Grants for myuser@%                                                                                   |
+-----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'myuser'@'%' IDENTIFIED BY PASSWORD '*7733323232...' |
| GRANT ALL PRIVILEGES ON `db1`.* TO 'myuser'@'%'                                                |
| GRANT ALL PRIVILEGES ON `db2`.* TO 'myuser'@'%'                                              |
+-----------------------------------------------------------------------------------------------------------+

私のPHPスクリプトではアクセスできますdb1が、エラーが発生します: INSERT command denied to user 'myuser'@'localhost' for table 'HISTORY'.

ユーザーはmyuser@localhostであり、人々は許可を追加することを提案しましたmyuser@localhostが、なぜこのユーザーは にアクセスでき、アクセスできないのdb1ですかdb2?

4

7 に答える 7

26

localhost%MySQLでは一致しません。あるべきように見えますが、実際にはそうではありません。特権と各データベースの特権user@localhostの両方に対して、に個別に特権を付与する必要があります。USAGE

または、一致するものとしてuser@127.0.0.1接続できます%。ローカルホストにIPアドレスを使用すると、ローカルホストと同じように機能するはずですが、そうではありません。両方を有効にするには、mysql.userテーブル(およびこの場合はテーブル)に2行必要です。mysql.db

localhostと127.0.0.1の違いを示すには:

asとして接続するにmysql -h localhostは、UNIXソケットインターフェイスを使用し、TCP/IPをバイパスします。これはパフォーマンスをわずかに向上させる可能性がありますが、上記のグラントマッチングに影響を与えます。

として接続することにより、ローカルTCP/IP接続を強制できますmysql -h 127.0.0.1。次に、あなたが行った助成金を受け取りますmyuser@%

したがって、ソケットインターフェイスとTCP / IPインターフェイスの両方で同じユーザー、パスワード、および特権を取得するには、次のすべてのステートメントを実行する必要があります。

GRANT USAGE ON *.* TO 'myuser'@'%' IDENTIFIED BY PASSWORD '*7733323232...'
GRANT USAGE ON *.* TO 'myuser'@'localhost' IDENTIFIED BY PASSWORD '*7733323232...'
GRANT ALL PRIVILEGES ON `db1`.* TO 'myuser'@'%'
GRANT ALL PRIVILEGES ON `db1`.* TO 'myuser'@'localhost'
GRANT ALL PRIVILEGES ON `db2`.* TO 'myuser'@'%'
GRANT ALL PRIVILEGES ON `db2`.* TO 'myuser'@'localhost'
于 2012-12-28T17:59:09.770 に答える
6

まだ実行していない場合は、変更があったことを認識してユーザーの特権テーブルを再ロードするflush privilegesように実行する必要があります。mysql

FLUSH PRIVILEGES;
于 2012-12-23T15:16:06.793 に答える
2

答えを追加すると思っただけです。私はこれをubuntuで試していました。許可、フラッシュを試しましたが、何も機能しませんでした (これは apt-get install mysql-server の直後です)。ニヤリと笑っただけで、サーバーをバウンスしましたが、それは機能し、新しいユーザーがログインできるようになりました。やった:

sudo service mysql restart

私はそれがうまくいったかわかりませんが、うまくいきました。

于 2014-09-15T15:26:59.670 に答える
2

これはおそらく GRANT とは関係ありません。

不適切なアクセス権を持つ非常に一般的な理由は、MySQL に存在するデフォルト ユーザーが原因です。特に''for User(匿名ユーザー) および/またはHostin mysql.usertable を使用するもの。MySQL が認証とプロキシ ユーザーを処理する方法、およびテーブル エントリで使用される並べ替え規則が原因で、mysql.user認証に使用したユーザー以外の予期しないユーザーを使用してしまう可能性があります。

認証中に使用SELECT USER();された接続ユーザーを検出し、現在のセッション中に権限が適用される有効なユーザーSELECT CURRENT_USER();を検出するために使用します。

そしてhttp://dev.mysql.com/doc/refman/5.6/en/connection-access.htmlから

特定のユーザー名について、サーバーが接続の一致を見つけようとするときに、そのユーザーを明示的に指定するすべての行が最初に使用されると考えるのはよくある誤解です。本当じゃない。サーバーに接続できるが、権限が期待どおりでない場合は、他のアカウントとして認証されている可能性があります。

次のようなmysql.user

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| %         | root     | ... (root from any host)
| %         | jeffrey  | ... (jeffrey from any host)
| localhost | root     | ... (root from localhost)
| localhost |          | ... (any user from localhost)
+-----------+----------+-

となり、

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-

複数の一致を処理するために、サーバーがユーザー テーブルをメモリに読み込むたびに。
クライアントが接続を試みると、サーバーはソートされた順序で行を調べ、クライアントのホスト名とユーザー名に一致する最初の行を使用します。
優先順位は次のとおりです: 値 (IP アドレス、ホスト名、ユーザー名など) > '%'>''

ほとんどの場合、アプリケーション サーバー/クライアントはデータベースと同じホストで実行されているため、localhost認証中にホスト名が取得されます。の代わりに照合されるものを
mysql -u jeffrey使用します。jeffrey@localhost''@localhostjeffrey@%

実行$MYSQL_HOME/bin/mysql_secure_installationすると、インストールを保護しながら匿名ユーザーが削除され、この予期しない動作が軽減されます。

以下も確認してください:
[1] http://bugs.mysql.com/bug.php?id=36576 (最後の前のコメントを確認してください)
[2] http://bugs.mysql.com/bug.php?id=69570

于 2014-07-19T12:21:41.873 に答える
1

'myuser'@'localhost'にも特権を付与する必要があります。

GRANT ALL PRIVILEGES ON `db1`.* TO 'myuser'@'localhost';
GRANT ALL PRIVILEGES ON `db2_beta`.* TO 'myuser'@'localhost';

それ以外の場合、dbのインストール中に作成された匿名ユーザー@localhostは、ここで説明するように、ワイルドカードホスト名(%)を持つユーザーの間で優先されます。

http://dev.mysql.com/doc/refman/5.5/en/adding-users.html

于 2012-12-23T15:32:29.767 に答える
-1

私は過去に同じ問題に遭遇しました。次のことを試しましたか?

GRANT ALL ON `db1`.* TO 'myuser'@'%' IDENTIFIED BY PASSWORD '*7733323232...';
GRANT ALL ON `db2`.* TO 'myuser'@'%' IDENTIFIED BY PASSWORD '*7733323232...';
FLUSH PRIVILEGES;
于 2013-01-04T16:03:55.307 に答える