1

ユーザー' myuser'と2つのデータベースがあります。' db1'および' db2'。

' myuser'はすでに使用する権限を持っているので、次のクエリを使用して、db1''を使用するための追加のアクセス許可を彼に付与したいと思いました。db2

GRANT ALL ON db2.* TO 'myuser'@'localhost';

付与ステートメントを実行した後、' myuser'最初のデータベースへの接続が失われました' db1'

間違ったホスト名を使用したのではないかと思います。'localhost'の代わりに'%'を使用する必要がありました。私がする時:

 select host from mysql.user where user = 'myuser';

これで、2つのホストレコード'%'localhostそのユーザーの''が表示されます

SHOW GRANTステートメントを実行すると、さまざまなホストのアクセス許可を取得します。'localhost'および'%'。

mysql> SHOW GRANTS FOR 'myuser'@'localhost';
+----------------------------------------------------------------------+
| Grants for myuser@localhost                                      |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'myuser'@'localhost'                       |
| GRANT ALL PRIVILEGES ON `beta_version`.* TO 'myuser'@'localhost' |
+----------------------------------------------------------------------+

mysql> SHOW GRANTS FOR 'myuser'@'%';
+-----------------------------------------------------------------------------------------------------------+
| Grants for myuser@%                                                                                   |
+-----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'myuser'@'%' IDENTIFIED BY PASSWORD '*6ASDFASDFASDF...' 
| GRANT ALL PRIVILEGES ON `myuser`.* TO 'myuser'@'%'                                                
+-----------------------------------------------------------------------------------------------------------+

myuserPHPスクリプトとphpMyAdminで''が機能しなくなった原因は何ですか?

4

2 に答える 2

2

MySQLは、ユーザー名とホストの両方によってユーザーを識別します。MySQLがログイン時に認証を行う場合、MySQLは最初に完全に一致するホスト名を探します。完全に一致するものが見つからない場合は、「%」ワイルドカードを含むホストを探します。

を実行すると、MySQLは新しいユーザーを作成しました(ステートメントに指定されてGRANT ... TO myuser@localhostいないため、パスワードはありません。IDENTIFIED BY

次に、ローカルホストからログインしようとすると、mysqldはmysql.userテーブルでmyuser一致するエントリを見つけようとしましたが、それが見つかりました。'myuser'@'localhost'そして、セッションはそのユーザーに割り当てられた特権を取得しました。

(もう少し正確に言うと、mysqldはmysql.userテーブルの内容を実際には調べません。これは、ビルド時にテーブルから入力されたメモリ内構造を実際に調べます。メモリ構造は、GRANT、REVOKE、またはFLUSH PRIVILEGESステートメントによってトリガーされます。)

その新しいユーザーを追加する前に何が起こっていたのか、mysqldはユーザーとホスト名に完全に一致するものを探していましたが、見つかりませんでした。ただし、「%」ワイルドカードを使用したエントリが見つかったため、それに一致したため、セッションは「myuser」@「%」ユーザーに付与されたすべての特権を取得しました。


2人のユーザー は'u'@'%''u'@'localhost'互いに分離して区別されます。特権は、各ユーザーに個別に付与する必要があります。'u'@'%'そのユーザーにのみ適用され、に適用されないように付与された特権'u'@'localhost'

于 2012-12-22T00:05:10.057 に答える
0

USAGEは、「特権がないことを意味します。これは、ローカルホストから接続するときにユーザーに与えたものです。

localhostは%よりも優先されると思うので、ユーザーがlocalhostから接続している場合、それが使用される許可です。

両方のスキーマへのアクセスを%(またはそれが必要な場合はlocalhost)に許可すると、明確でより適切に機能するはずです。

于 2012-12-21T21:26:39.523 に答える