Créez un nouvel utilisateur dans MySQL et donnez-lui un accès complet à une base de données

628

Je veux créer un nouvel utilisateur dans MySQL et lui donner un accès complet à une seule base de données, disons dbTest, que je crée avec une commande comme create database dbTest;. Quelles seraient les commandes MySQL pour faire cela?

jimgh
la source

Réponses:

829

Essayez ceci pour créer l'utilisateur:

CREATE USER 'user'@'hostname';

Essayez ceci pour lui donner accès à la base de données dbTest:

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Si vous exécutez le code / site accédant à MySQL sur la même machine, le nom d'hôte serait localhost.

Maintenant, la panne.

GRANT - Il s'agit de la commande utilisée pour créer des utilisateurs et accorder des droits sur les bases de données, les tables, etc.

ALL PRIVILEGES- Cela indique que l'utilisateur aura tous les privilèges standard. Cependant, cela n'inclut pas le privilège d'utiliser la commande GRANT.

dbtest.*- Cette instructions MySQL pour appliquer ces droits pour une utilisation dans l'ensemble de la base de données dbtest. Vous pouvez remplacer le * par des noms de table spécifiques ou stocker des routines si vous le souhaitez.

TO 'user'@'hostname'- «utilisateur» est le nom d'utilisateur du compte d'utilisateur que vous créez. Remarque: Vous devez avoir les guillemets simples là-dedans. 'hostname' indique à MySQL à partir de quels hôtes l'utilisateur peut se connecter. Si vous ne le souhaitez que sur la même machine, utilisezlocalhost

IDENTIFIED BY 'password' - Comme vous l'auriez deviné, cela définit le mot de passe de cet utilisateur.

Dan McGrath
la source
82
Si vous autorisez l'accès au réseau et souhaitez une connexion à partir de n'importe quel hôte, vous pouvez remplacer «nom d'hôte» par «%». Par exemple, ... TO 'dbuser' @ '%' IDENTIFIED ... '%' est le caractère générique de l'hôte.
physicsmichael
17
N'oubliez pas de vider les privilèges lorsque vous travaillez sur des utilisateurs et des tables! :-)
corsiKa
31
Cela a fonctionné pour moi: CREATE USER 'user1' @ 'localhost' IDENTIFIED BY 'password'; ACCORDER TOUS LES PRIVILÈGES SUR db_database1. * À 'user1' @ 'localhost' IDENTIFIED BY 'password'; RINCER LES PRIVILÈGES;
Mohamad Fakih
4
@DanMcGrath: La clause IDENTIFIED BY 'password' est-elle obligatoire si l'utilisateur existe déjà et possède un mot de passe?
nanosoft
8
L'utilisation de GRANT pour créer un nouvel utilisateur sera supprimée dans les futures versions de MySQL (elle est obsolète au moment de la rédaction de cet article). À l'avenir, cela devra être fait avec deux appels, CREATE USER puis GRANT.
Darren Felton
325

Syntaxe

Pour créer un utilisateur dans MySQL / MariaDB 5.7.6 et supérieur, utilisez la CREATE USERsyntaxe :

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

puis pour accorder tous les accès à la base de données (par exemple my_db), utilisez la GRANTsyntaxe , par exemple

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

ALL( priv_type ) peut être remplacé par un privilège spécifique tel que SELECT, INSERT, UPDATE, ALTER, etc.

Ensuite, pour recharger les autorisations nouvellement attribuées, exécutez:

FLUSH PRIVILEGES;

Exécution

Pour exécuter les commandes ci-dessus, vous devez exécuter la mysqlcommande et les saisir dans l'invite, puis vous déconnecter par quitcommande ou Ctrl- D.

Pour exécuter à partir du shell, utilisez le -eparamètre (remplacez-le SELECT 1par l'une des commandes ci-dessus):

$ mysql -e "SELECT 1"

ou imprimer la déclaration à partir de l'entrée standard:

$ echo "FOO STATEMENT" | mysql

Si l' accès est refusé avec ci-dessus, spécifiez -u(pour l'utilisateur) et -p(pour le mot de passe) les paramètres, ou pour un accès à long terme, définissez vos informations d'identification ~/.my.cnf, par exemple

[client]
user=root
password=root

Intégration Shell

Pour les personnes qui ne sont pas familières avec la syntaxe MySQL, voici des fonctions shell pratiques qui sont faciles à mémoriser et à utiliser (pour les utiliser, vous devez charger les fonctions shell incluses plus bas).

Voici un exemple:

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

Pour utiliser les commandes ci-dessus, vous devez copier et coller les fonctions suivantes dans votre fichier rc (par exemple .bash_profile) et recharger votre shell ou source le fichier. Dans ce cas, tapez simplement source .bash_profile:

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

Remarque: Si vous préférez ne pas laisser de trace (comme les mots de passe) dans votre historique Bash, vérifiez: Comment empêcher les commandes de s'afficher dans l'historique bash?

kenorb
la source
1
Avez-vous besoin de créer l'utilisateur et d'accorder des privilèges séparément? J'ai trouvé que la commande grant semble créer l'utilisateur lui-même, au moins en regardant dans la table mysql.user, elle ressemble à ça.
Tim
@CreativityKills fonctionnera avec le mot de passe si vous les ajoutez dans votre ~/.my.cnfcomme suggéré ci-dessus.
kenorb
laisser des traces du mot de passe dans l'histoire du shell n'est pas une bonne idée
dmirkitanov
@dmirkitanov Vous pouvez empêcher cela en ajoutant un espace, voir: Comment empêcher les commandes de s'afficher dans l'historique bash?
kenorb
58

Pour créer un utilisateur et accorder tous les privilèges sur une base de données.

Connectez-vous à MySQL:

mysql -u root

Maintenant, créez et accordez

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Utilisateur anonyme (pour les tests locaux uniquement)

Alternativement, si vous souhaitez simplement accorder un accès illimité complet à une base de données (par exemple sur votre machine locale pour une instance de test, vous pouvez accorder l'accès à l'utilisateur anonyme, comme ceci:

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

Être conscient

C'est très bien pour les données indésirables en cours de développement. Ne faites pas cela avec tout ce qui vous tient à cœur.

superluminaire
la source
3
Vous pouvez créer un utilisateur anonyme comme ça, mais ne le faites pas! Il n'y a aucune bonne raison d'avoir un utilisateur avec des privilèges complets et sans mot de passe, mais cela pourrait bien vous gâcher un jour / année / entreprise / travail un jour si quelqu'un a accès à votre serveur qui ne devrait pas avoir. Pourquoi leur faciliter la tâche?
Luke Cousins
2
Si quelqu'un a obtenu un accès à distance à mon macbook, j'ai plus de soucis que le contenu de ma base de données de développement. Je dois réitérer, ceci est uniquement pour les tests locaux, ne le faites pas avec des données réelles.
superluminaire
4
Exactement, avec toutes ces autres choses à se soucier, ne vous inquiétez pas du contenu de votre base de données de développement. Votre base de données de développement peut (aura probablement) des extraits de données de base de données en direct (par exemple pour répliquer un bogue) que tous les efforts doivent être faits pour assurer la sécurité. Il n'est tout simplement pas nécessaire d'avoir accès à la base de données sans mot de passe. Cela ne fait même pas gagner de temps. Ne vaut pas les tracas potentiels.
Luke Cousins
1
Peut-être. Dans mon cas, ce sont des données indésirables, je vais vivre avec le risque.
superluminaire
17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

ignorez l' option -p , si l'utilisateur mysql n'a pas de mot de passe ou appuyez simplement sur le bouton "[Entrée]" pour contourner. les chaînes entourées d'accolades doivent être remplacées par des valeurs réelles.

SK Venkat
la source
13

Vous pouvez créer de nouveaux utilisateurs à l'aide de l' instruction CREATE USER et leur accorder des droits à l'aide de GRANT .

candiru
la source
CRÉER UN UTILISATEUR 'jeffrey' @ 'localhost' IDENTIFIÉ PAR 'mypass';
cgl
6

Pour moi, cela a fonctionné.

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

  • spowner: nom d'utilisateur
  • 1234: mot de passe du spowner
  • test: la base de données 'spowner' a le droit d'accéder à
Park JongBum
la source
2

La commande ci-dessous fonctionnera si vous voulez créer un nouvel utilisateur lui donner tous les accès à une base de données spécifique (pas toutes les bases de données de votre Mysql) sur votre hôte local.

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Cela accordera tous les privilèges à une seule base de données test_database(dans votre casdbTest ) à cet utilisateur sur localhost.

Vérifiez les autorisations accordées à cet utilisateur par la commande ci-dessus en exécutant la commande ci-dessous.

SHOW GRANTS FOR 'user'@'localhost'

Au cas où, si vous souhaitez limiter l'accès utilisateur à une seule table

GRANT ALL ON mydb.table_name TO 'someuser'@'host';
Prabhakar Undurthi
la source
Erreur de syntaxe et une faute de frappe dans votre première ligne, le "PRIVILEGES ON 'test_datase'" ne devrait pas avoir de guillemets, devrait avoir le ". *" Après, par exemple, test_datase. *, Et est une faute de frappe, devrait être "test_database ".
Brettins
0

Dans le cas où host partie est omise, elle prend par défaut le symbole générique %, autorisant tous les hôtes.

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

SELECT * FROM mysql.user;
SHOW GRANTS FOR 'service-api'
dummyDev
la source