web-dev-qa-db-fra.com

Modification des autorisations d'hôte pour les utilisateurs MySQL

J'ai les subventions suivantes pour un utilisateur/une base de données

mysql> SHOW GRANTS FOR 'username'@'localhost';
+---------------------------------------------------------------------------+
| Grants for username@localhost                                             |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT ALL PRIVILEGES ON `userdb`.* TO 'username'@'localhost'              |
+---------------------------------------------------------------------------+

Pour activer l'accès externe à la base de données, je dois remplacer localhost par %. Une façon de procéder consiste à REVOKE toutes les autorisations et à le redéfinir. Le problème est qu'il existe un mot de passe défini que je ne connais pas, donc si je révoque l'autorisation, je ne peux pas la rétablir.

Existe-t-il un moyen de changer le nom d'hôte localhost en % (et inversement) sans révoquer l'autorisation elle-même?

48
Fu86

Si vous avez accès à la base de données mysql, vous pouvez modifier directement les tables de droits:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';

... et une instruction UPDATE- analogue pour la modifier.

Vous devrez peut-être également apporter des modifications à mysql.db table également:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';

puis rincez pour appliquer les privilèges:

FLUSH PRIVILEGES;
67
nickgrim

Meilleure réponse sur Stackoverflow suggérant d'utiliser RENAME USER qui copie les privilèges utilisateur.

L'utilisation du langage de contrôle des données (instructions GRANT, REVOKE, RENAME, etc.) ne nécessite pas FLUSH PRIVILEGES; et est requis dans une architecture comme Galera ou la réplication de groupe dans les versions MySQL ayant des tables MyISAM dans la base de données mysql car les tables MyISAM ne sont pas répliquées.

8
Antonio Bardazzi

Je suis tombé sur celui-ci aussi, et la solution proposée n'a pas fonctionné, car les privilèges spécifiques à la base de données ne seraient pas déplacés également. ce que j'ai fait:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
2
Roman Haefeli

Pour modifier les privilèges, révoquez d'abord toutes les autorisations accordées à l'utilisateur

 revoke all privileges on *.* from 'username'@'localhost';

 grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';

 flush privileges;
1

Il manque beaucoup de tables si vous avez des privilèges autres que simplement db (comme les tables ou les colonnes, etc.). Selon les autorisations dont dispose votre utilisateur, vous devrez peut-être mettre à jour toutes ces tables ou certaines:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.tables_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.columns_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.procs_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.proxies_priv SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
0
mikew