Maison > Article > base de données > Comment MySQL gère-t-il les autorisations ?
Le contenu de cet article est de présenter comment MySQL effectue la gestion des autorisations ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
La table d'autorisations de MySQL est chargée dans la mémoire au démarrage de la base de données. Lorsque l'utilisateur réussit l'authentification d'identité, les autorisations correspondantes sont accessibles dans la mémoire. De cette manière, l'utilisateur peut définir des plages d'autorisations dans la base de données. .Diverses opérations à l'intérieur. [Tutoriels vidéo recommandés : Tutoriel MySQL]
Dans les deux processus d'accès aux autorisations, le système utilisera "mysql" Les trois plus Les tables d'autorisations importantes dans la base de données (créées lors de l'installation de MySQL, le nom de la base de données est "mysql") sont l'utilisateur, l'hôte et la base de données.
Parmi ces 3 tables, la plus importante est la table user, suivie de la table db. La table host n'est pas utilisée dans la plupart des cas.
Les colonnes de l'utilisateur sont principalement divisées en 4 parties : les colonnes utilisateur, les colonnes d'autorisation, les colonnes de sécurité et les colonnes de contrôle des ressources.
Habituellement, les colonnes les plus couramment utilisées sont les colonnes d'utilisateurs et les colonnes d'autorisations, où les colonnes d'autorisations sont divisées en autorisations normales et autorisations de gestion. Les autorisations ordinaires sont utilisées pour les opérations de base de données, telles que select_priv
, super_priv
, etc.
Lorsqu'un utilisateur se connecte, le processus d'accès à la table des autorisations comporte les deux processus suivants :
Tout d'abord, commencez par l'hôte, l'utilisateur et le mot de passe dans la table des utilisateurs. . Les champs sont utilisés pour déterminer si l'adresse IP, le nom d'utilisateur et le mot de passe connectés existent dans le tableau. S'ils existent, l'authentification est réussie, sinon la connexion est rejetée.
Si l'authentification d'identité est réussie, les autorisations de la base de données seront obtenues dans l'ordre du tableau d'autorisations suivant : user -> db ->
Dans ces tableaux d'autorisations, la portée des autorisations diminue dans l'ordre et les autorisations globales couvrent les autorisations locales. La première étape ci-dessus est facile à comprendre. Utilisons un exemple pour expliquer la deuxième étape en détail.
Afin de faciliter les tests, vous devez modifier la variable sql_mode
// sql_mode 默认值中有 NO_AUTO_CREATE_USER (防止GRANT自动创建新用户,除非还指定了密码) SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
MySQL [mysql]> grant select on *.* to zj@localhost; Query OK, 0 rows affected, 2 warnings (0.00 sec) MySQL [mysql]> select * from user where user="zj" and host='localhost' \G; *************************** 1. row *************************** Host: localhost User: zj Select_priv: Y Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Reload_priv: N ...2. En regardant la table db
MySQL [mysql]> select * from db where user='zj' \G ; Empty set (0.00 sec)nous pouvons constater que la colonne select_priv de la table user est "Y", mais il n'y a aucun enregistrement dans la table db. c'est-à-dire que toutes les bases de données ont les mêmes utilisateurs avec des autorisations n'ont pas besoin d'être enregistrés dans la table db, mais doivent seulement changer select_priv dans la table user en "Y". En d'autres termes, chaque autorisation de la table utilisateur représente les autorisations sur toutes les bases de données. 3. Modifiez les autorisations sur zj@localhost pour sélectionner uniquement les autorisations sur toutes les tables de la base de données t2.
MySQL [mysql]> revoke select on *.* from zj@localhost; Query OK, 0 rows affected, 1 warning (0.02 sec) MySQL [mysql]> grant select on t2.* to zj@localhost; Query OK, 0 rows affected, 1 warning (0.04 sec) MySQL [mysql]> select * from user where user='zj' \G; *************************** 1. row *************************** Host: localhost User: zj Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Reload_priv: N ... MySQL [mysql]> select * from db where user='zj' \G; *************************** 1. row *************************** Host: localhost Db: t2 User: zj Select_priv: Y Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Grant_priv: NÀ ce moment-là, il a été découvert que select_priv dans la table utilisateur était devenu "N", et un enregistrement avec db t2 a été ajouté à la table db. Autrement dit, lorsque certaines autorisations ne sont accordées qu'à une partie de la base de données, la colonne d'autorisation correspondante dans la table utilisateur reste "N" et les autorisations spécifiques à la base de données sont écrites dans la table db. Le mécanisme d'autorisation des tables et des colonnes est similaire à celui de la base de données. Comme le montre l'exemple ci-dessus, lorsqu'un utilisateur réussit l'authentification des autorisations et que les autorisations sont attribuées, les autorisations seront attribuées dans l'ordre utilisateur -> tables_priv -> Autrement dit, les autorisations globales seront vérifiées en premier par l'utilisateur de la table, si l'autorisation correspondante dans l'utilisateur est "Y", alors l'autorisation de cet utilisateur sur toutes les bases de données est "Y", et db, tables_priv et columns_priv ne seront plus vérifiées si c'est le cas ; "N", l'autorisation de cet utilisateur sera vérifiée dans la table de base de données. La base de données spécifique correspondant à l'utilisateur, et obtiendra l'autorisation de "Y" dans la base de données si l'autorisation correspondante dans la base de données est "N", alors vérifiez la permission ; autorisations dans tables_priv et columns_priv tour à tour. Si toutes sont "N", il est jugé comme n'a pas d'autorisation. 2. Gestion des comptes Comprend principalement la création de compte, les modifications d'autorisations et la suppression de compte. 1. Créez un compte Créez en utilisant la syntaxe d'octroi, exemple : (1) Créez l'utilisateur zj avec des autorisations qui peuvent exécuter toutes les autorisations sur toutes les bases de données et ne peuvent être accessible depuis Connect localement.
MySQL [mysql]> grant all privileges on *.* to zj@localhost; Query OK, 0 rows affected, 2 warnings (0.00 sec) MySQL [mysql]> select * from user where user="zj" and host="localhost" \G; *************************** 1. row *************************** Host: localhost User: zj Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Reload_priv: Y Shutdown_priv: YOn constate qu'à l'exception de l'autorisation grant_priv, toutes les autorisations sont "Y" dans la table des utilisateurs. (2) Sur la base de (1), augmentez l'autorisation d'octroi pour zj
MySQL [(none)]> grant all privileges on *.* to zj@localhost with grant option; Query OK, 0 rows affected, 1 warning (0.01 sec) MySQL [mysql]> select * from user where user="zj" and host='localhost' \G ; *************************** 1. row *************************** Host: localhost User: zj Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Reload_priv: Y Shutdown_priv: Y Process_priv: Y File_priv: Y Grant_priv: Y ...(3) Sur la base de (2), définissez le mot de passe sur "123"
MySQL [mysql]> grant all privileges on *.* to zj@localhost identified by '123' with grant option; Query OK, 0 rows affected, 2 warnings (0.01 sec) MySQL [mysql]> select * from user where user="zj" and host="localhost" \G ; *************************** 1. row *************************** Host: localhost User: zj Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Reload_priv: Y ...... authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 password_expired: N password_last_changed: 2017-09-25 20:29:42 password_lifetime: NULLVous pouvez constater que le mot de passe devient un ensemble de chaînes cryptées. (4) Créez un nouvel utilisateur zj2, qui peut se connecter depuis n'importe quelle IP. Les autorisations sont de sélectionner, mettre à jour, insérer et supprimer des opérations sur toutes les tables de la base de données t2. Le mot de passe initial est "123" <.>Les autorisations dans la table utilisateur sont toutes "N", et les autorisations des enregistrements ajoutés dans la table db sont toutes "Y". En général, accordez uniquement aux utilisateurs les autorisations appropriées sans accorder d’autorisations excessives.
MySQL [mysql]> grant select ,insert, update,delete on t2.* to 'zj2'@'%' identified by '123'; Query OK, 0 rows affected, 1 warning (0.00 sec) MySQL [mysql]> select * from user where user='zj2' and host="%" \G; *************************** 1. row *************************** Host: % User: zj2 Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N ...... authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 password_expired: N password_last_changed: 2017-09-25 20:37:49 password_lifetime: NULL MySQL [mysql]> select * from db where user="zj2" and host='%' \G; *************************** 1. row *************************** Host: % Db: t2 User: zj2 Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: N Drop_priv: N ......
L'IP dans cet exemple est limitée à toutes les IP qui peuvent se connecter, elle est donc définie sur "*". Dans la base de données mysql, elle est contrôlée via le champ host de la table user. les types de missions suivants.
注意: mysql 数据库的 user 表中 host 的值为 “*” 或者空,表示所有外部 IP 都可以连接,但是不包括本地服务器 localhost,因此,如果要包括本地服务器,必须单独为 localhost 赋予权限。
MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%'; Query OK, 0 rows affected, 1 warning (0.00 sec)
因为这几个权限都是属于管理权限,因此不能够指定某个数据库,on 后面必须跟 “.”,下面语法将提示错误
MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%'; ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
MySQL [mysql]> grant usage on *.* to 'zj4'@'localhost'; Query OK, 0 rows affected, 2 warnings (0.01 sec) MySQL [mysql]> exit Bye zj@bogon:~$ mysql -uzj4 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 78 Server version: 5.7.18-log Source distribution Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | +--------------------+ 1 row in set (0.02 sec)
usage 权限只能用于数据库登录,不能执行任何操作
账号创建好后,可以通过如下命令查看权限:
show grants for user@host;
示例:
MySQL [(none)]> show grants for zj@localhost; +-------------------------------------------------------------------+ | Grants for zj@localhost | +-------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'zj'@'localhost' WITH GRANT OPTION | +-------------------------------------------------------------------+ 1 row in set (0.01 sec)
可以进行权限的新增和回收。和创建账号一样,权限变更也有两种方法:使用 grant(新增) 和 revoke (回收) 语句,或者更改权限表。
MySQL [(none)]> show grants for zj4@localhost; +-----------------------------------------+ | Grants for zj4@localhost | +-----------------------------------------+ | GRANT USAGE ON *.* TO 'zj4'@'localhost' | +-----------------------------------------+ 1 row in set (0.00 sec)
MySQL [(none)]> grant select on *.* to 'zj4'@'localhost'; Query OK, 0 rows affected, 1 warning (0.00 sec) MySQL [(none)]> show grants for zj4@localhost; +------------------------------------------+ | Grants for zj4@localhost | +------------------------------------------+ | GRANT SELECT ON *.* TO 'zj4'@'localhost' | +------------------------------------------+ 1 row in set (0.00 sec)
MySQL [(none)]> show grants for 'zj4'@'localhost'; +--------------------------------------------------+ | Grants for zj4@localhost | +--------------------------------------------------+ | GRANT SELECT, INSERT ON *.* TO 'zj4'@'localhost' | +--------------------------------------------------+ 1 row in set (0.00 sec)
revoke 语句可以回收已经赋予的权限,对于上面的例子,这里决定要收回 zj4@localhost 上的 insert 和 select 权限:
MySQL [(none)]> revoke select,insert on *.* from zj4@localhost; Query OK, 0 rows affected, 1 warning (0.00 sec) MySQL [(none)]> show grants for zj4@localhost; +-----------------------------------------+ | Grants for zj4@localhost | +-----------------------------------------+ | GRANT USAGE ON *.* TO 'zj4'@'localhost' | +-----------------------------------------+ 1 row in set (0.00 sec)
usage 权限不能被回收,也就是说,revoke 用户并不能删除用户。
shell> mysqladmin -u user_name -h host_name password "123456"
mysql> set password for 'username'@'%' = password('pwd');
如果是更改自己的密码,可以省略 for 语句
mysql> set password=password('pwd');
mysql> grant usage on *.* to 'username'@'%' identified by 'pwd';
要彻底的删除账号,可以使用 drop user :
drop user zj@localhost;
创建 MySQL 账号时,还有一类选项称为账号资源限制
,这类选项的作用是限制每个账号实际具有的资源限制,这里的“资源”主要包括:
max_queries_per_hour count : 单个账号每小时执行的查询次数
max_upodates_per_hour count : 单个账号每小时执行的更新次数
max_connections_per_hour count : 单个账号每小时连接服务器的次数
max_user_connections count : 单个账号并发连接服务器的次数
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!