Maison > base de données > tutoriel mysql > le corps du texte

Comment MySQL gère-t-il les autorisations ?

青灯夜游
Libérer: 2019-02-26 11:00:23
avant
4092 Les gens l'ont consulté

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]

1. Accès aux tables d'autorisations

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';
Copier après la connexion
Copier après la connexion

1 Créer l'utilisateur zj@localhost et accorder des autorisations de sélection à toutes les tables de toutes les bases de données

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
...
Copier après la connexion
Copier après la connexion
2. En regardant la table db

MySQL [mysql]> select * from db where user='zj' \G ;
Empty set (0.00 sec)
Copier après la connexion
Copier après la connexion
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
Copier après la connexion
Copier après la connexion
À 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: Y
Copier après la connexion
On 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
...
Copier après la connexion
(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: NULL
Copier après la connexion
Vous 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
......
Copier après la connexion
Copier après la connexion

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.

    La valeur de l'hôte peut être un nom d'hôte ou un numéro IP, ou "localhost" indique l'hôte local.
  • Vous pouvez utiliser les caractères génériques "%" et "_" dans la valeur de la colonne Hôte
  • La valeur de l'hôte "%" correspond à n'importe quel nom d'hôte , les valeurs d'hôte vides sont équivalentes à "%" et leur signification est la même que l'opération de correspondance de modèle de l'opérateur similaire.

注意: mysql 数据库的 user 表中 host 的值为 “*” 或者空,表示所有外部 IP 都可以连接,但是不包括本地服务器 localhost,因此,如果要包括本地服务器,必须单独为 localhost 赋予权限。

(5) 授予 super、process、file 权限给用户 zj3@%
MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%';
Query OK, 0 rows affected, 1 warning (0.00 sec)
Copier après la connexion
Copier après la connexion

因为这几个权限都是属于管理权限,因此不能够指定某个数据库,on 后面必须跟 “.”,下面语法将提示错误

MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
Copier après la connexion
Copier après la connexion
(6) 只授予登录权限给 zj4@localhost
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)
Copier après la connexion
Copier après la connexion

usage 权限只能用于数据库登录,不能执行任何操作

2. 查看账号权限

账号创建好后,可以通过如下命令查看权限:

show grants for user@host;
Copier après la connexion
Copier après la connexion

示例:

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)
Copier après la connexion
Copier après la connexion

3. 更改账号权限

可以进行权限的新增和回收。和创建账号一样,权限变更也有两种方法:使用 grant(新增) 和 revoke (回收) 语句,或者更改权限表。

示例:
(1) zj4@localhost 目前只有登录权限
MySQL [(none)]> show grants for zj4@localhost;
+-----------------------------------------+
| Grants for zj4@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'zj4'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)
Copier après la connexion
Copier après la connexion
(2) 赋予 zj4@localhost 所有数据库上的所有表的 select 权限
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)
Copier après la connexion
Copier après la connexion
(3) 继续给 zj4@localhost 赋予 select 和 insert 权限,和已有的 select 权限进行合并
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)
Copier après la connexion
Copier après la connexion

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)
Copier après la connexion
Copier après la connexion

usage 权限不能被回收,也就是说,revoke 用户并不能删除用户。

4. 修改账号密码

(1) 可以用 mysqladmin 命令在命令行指定密码。
shell> mysqladmin -u user_name -h host_name password "123456"
Copier après la connexion
Copier après la connexion
(2) 执行 set password 语句。
mysql> set password for 'username'@'%' = password('pwd');
Copier après la connexion
Copier après la connexion

如果是更改自己的密码,可以省略 for 语句

mysql> set password=password('pwd');
Copier après la connexion
Copier après la connexion
(3) 可以在全局级别使用 grant usage 语句(在“.”)来指定某个账户的密码而不影响账户当前的权限。
mysql> grant usage on *.* to 'username'@'%' identified by 'pwd';
Copier après la connexion
Copier après la connexion

5. 删除账号

要彻底的删除账号,可以使用 drop user :

drop user zj@localhost;
Copier après la connexion
Copier après la connexion

6. 账号资源限制

创建 MySQL 账号时,还有一类选项称为账号资源限制,这类选项的作用是限制每个账号实际具有的资源限制,这里的“资源”主要包括:

  • max_queries_per_hour count : 单个账号每小时执行的查询次数

  • max_upodates_per_hour count : 单个账号每小时执行的更新次数

  • max_connections_per_hour count : 单个账号每小时连接服务器的次数

  • max_user_connections count : 单个账号并发连接服务器的次数








                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

La table des 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. ces utilisateurs peuvent effectuer diverses opérations dans le cadre de l'autorité dans la base de données. 1. Accès aux tables d'autorisations Dans les deux processus d'accès aux autorisations, le système utilisera la base de données "mysql" (créée lors de l'installation de MySQL et le nom de la base de données est "mysql" ), les trois tables d'autorisations les plus importantes 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. ,

, 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. select_privsuper_privAfin de faciliter les tests, vous devez modifier la variable sql_mode

    1 Créer l'utilisateur zj@localhost et accorder des autorisations de sélection à toutes les tables de toutes les bases de données
  • 2. Vérifiez la table db

  • et vous constaterez que la colonne select_priv de la table utilisateur 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.

À 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
// sql_mode 默认值中有 NO_AUTO_CREATE_USER (防止GRANT自动创建新用户,除非还指定了密码)
SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
Copier après la connexion
Copier après la connexion

Comprend principalement la création de compte, les modifications d'autorisations et la suppression de compte.

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
...
Copier après la connexion
Copier après la connexion
1. Créez un compte

Créez en utilisant la syntaxe d'octroi, exemple :
MySQL [mysql]> select * from db where user='zj' \G ;
Empty set (0.00 sec)
Copier après la connexion
Copier après la connexion

(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.

On constate qu'à l'exception de l'autorisation grant_priv, toutes les autorisations sont "Y" dans la table des utilisateurs.
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
Copier après la connexion
Copier après la connexion

(2) Sur la base de (1), augmentez l'autorisation d'octroi pour zj

(3) Sur la base de (2), définissez le mot de passe sur "123"

Vous pouvez constater que le mot de passe devient un ensemble de chaînes cryptées.

(4) 创建新用户 zj2,可以从任何 IP 连接,权限为对 t2 数据库里的所有表进行 select 、update、insert 和 delete 操作,初始密码为“123”
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
......
Copier après la connexion
Copier après la connexion

user 表中的权限都是“N”,db 表中增加的记录权限则都是“Y”。一般的,只授予用户适当的权限,而不会授予过多的权限。

本例中的 IP 限制为所有 IP 都可以连接,因此设置为 “*”,mysql 数据库中是通过 user 表的 host 字段来进行控制,host 可以是以下类型的赋值。

  • Host 值可以是主机名或IP号,或 “localhost” 指出本地主机。

  • 可以在 Host 列值使用通配符字符 “%” 和 “_”

  • Host 值 “%” 匹配任何主机名,空 Host 值等价于 “%”,它们的含义与 like 操作符的模式匹配操作相同。

注意: mysql 数据库的 user 表中 host 的值为 “*” 或者空,表示所有外部 IP 都可以连接,但是不包括本地服务器 localhost,因此,如果要包括本地服务器,必须单独为 localhost 赋予权限。

(5) 授予 super、process、file 权限给用户 zj3@%
MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%';
Query OK, 0 rows affected, 1 warning (0.00 sec)
Copier après la connexion
Copier après la connexion

因为这几个权限都是属于管理权限,因此不能够指定某个数据库,on 后面必须跟 “.”,下面语法将提示错误

MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
Copier après la connexion
Copier après la connexion
(6) 只授予登录权限给 zj4@localhost
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)
Copier après la connexion
Copier après la connexion

usage 权限只能用于数据库登录,不能执行任何操作

2. 查看账号权限

账号创建好后,可以通过如下命令查看权限:

show grants for user@host;
Copier après la connexion
Copier après la connexion

示例:

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)
Copier après la connexion
Copier après la connexion

3. 更改账号权限

可以进行权限的新增和回收。和创建账号一样,权限变更也有两种方法:使用 grant(新增) 和 revoke (回收) 语句,或者更改权限表。

示例:
(1) zj4@localhost 目前只有登录权限
MySQL [(none)]> show grants for zj4@localhost;
+-----------------------------------------+
| Grants for zj4@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'zj4'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)
Copier après la connexion
Copier après la connexion
(2) 赋予 zj4@localhost 所有数据库上的所有表的 select 权限
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)
Copier après la connexion
Copier après la connexion
(3) 继续给 zj4@localhost 赋予 select 和 insert 权限,和已有的 select 权限进行合并
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)
Copier après la connexion
Copier après la connexion

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)
Copier après la connexion
Copier après la connexion

usage 权限不能被回收,也就是说,revoke 用户并不能删除用户。

4. 修改账号密码

(1) 可以用 mysqladmin 命令在命令行指定密码。
shell> mysqladmin -u user_name -h host_name password "123456"
Copier après la connexion
Copier après la connexion
(2) 执行 set password 语句。
mysql> set password for 'username'@'%' = password('pwd');
Copier après la connexion
Copier après la connexion

如果是更改自己的密码,可以省略 for 语句

mysql> set password=password('pwd');
Copier après la connexion
Copier après la connexion
(3) 可以在全局级别使用 grant usage 语句(在“.”)来指定某个账户的密码而不影响账户当前的权限。
mysql> grant usage on *.* to 'username'@'%' identified by 'pwd';
Copier après la connexion
Copier après la connexion

5. 删除账号

要彻底的删除账号,可以使用 drop user :

drop user zj@localhost;
Copier après la connexion
Copier après la connexion

6. 账号资源限制

创建 MySQL 账号时,还有一类选项称为账号资源限制,这类选项的作用是限制每个账号实际具有的资源限制,这里的“资源”主要包括:

  • max_queries_per_hour count : 单个账号每小时执行的查询次数

  • max_upodates_per_hour count : 单个账号每小时执行的更新次数

  • max_connections_per_hour count : 单个账号每小时连接服务器的次数

  • max_user_connections count : 单个账号并发连接服务器的次数


  • Comment MySQL gère-t-il les autorisations ?



你可能感兴趣的



评论                                                    

默认排序                        时间排序



载入中...

显示更多评论



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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!