Heim  >  Artikel  >  Datenbank  >  Wie führt MySQL die Berechtigungsverwaltung durch?

Wie führt MySQL die Berechtigungsverwaltung durch?

青灯夜游
青灯夜游nach vorne
2019-02-26 11:00:234049Durchsuche

Der Inhalt dieses Artikels besteht darin, vorzustellen, wie MySQL die Berechtigungsverwaltung durchführt. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

Die Berechtigungstabelle von MySQL wird beim Start der Datenbank in den Speicher geladen. Wenn der Benutzer die Identitätsauthentifizierung besteht, wird auf die entsprechenden Berechtigungen im Speicher zugegriffen. Auf diese Weise kann der Benutzer Berechtigungsbereiche in der Datenbank festlegen . Verschiedene Operationen innerhalb. [Empfohlene Video-Tutorials: MySQL-Tutorial]

1. Zugriff auf Berechtigungstabellen

In den beiden Prozessen des Berechtigungszugriffs verwendet das System „MySQL“. Die drei am häufigsten Wichtige Berechtigungstabellen in der Datenbank (erstellt bei der Installation von MySQL, der Datenbankname lautet „mysql“) sind Benutzer, Host und Datenbank.

Unter diesen 3 Tabellen ist die Benutzertabelle die wichtigste, gefolgt von der Datenbanktabelle. Die Hosttabelle wird in den meisten Fällen nicht verwendet.

Die Spalten im Benutzer sind hauptsächlich in 4 Teile unterteilt: Benutzerspalten, Berechtigungsspalten, Sicherheitsspalten und Ressourcenkontrollspalten.

Normalerweise sind die am häufigsten verwendeten Spalten Benutzerspalten und Berechtigungsspalten, wobei Berechtigungsspalten in normale Berechtigungen und Verwaltungsberechtigungen unterteilt sind. Gewöhnliche Berechtigungen werden für Datenbankoperationen verwendet, z. B. select_priv, super_priv usw.

Wenn ein Benutzer eine Verbindung herstellt, umfasst der Zugriffsprozess der Berechtigungstabelle die folgenden zwei Prozesse:

  • Beginnen Sie zunächst mit dem Host, dem Benutzer und dem Kennwort in der Benutzertabelle . Felder werden verwendet, um zu bestimmen, ob die verbundene IP, der Benutzername und das Passwort in der Tabelle vorhanden sind. Wenn sie vorhanden sind, wird die Authentifizierung bestanden, andernfalls wird die Verbindung abgelehnt.

  • Wenn die Identitätsauthentifizierung bestanden wird, werden die Datenbankberechtigungen in der Reihenfolge der folgenden Berechtigungstabelle abgerufen: user -> tables_priv ->

In diesen Berechtigungstabellen nimmt der Umfang der Berechtigungen der Reihe nach ab und globale Berechtigungen decken lokale Berechtigungen ab. Die erste Stufe oben ist leicht zu verstehen. Lassen Sie uns die zweite Stufe anhand eines Beispiels im Detail erläutern.
Um das Testen zu erleichtern, müssen Sie die Variable sql_mode ändern

// sql_mode 默认值中有 NO_AUTO_CREATE_USER (防止GRANT自动创建新用户,除非还指定了密码)
SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

1. Erstellen Sie den Benutzer zj@localhost und erteilen Sie ausgewählten Berechtigungen für alle Tabellen in allen Datenbanken

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. Überprüfen Sie die Datenbanktabelle

MySQL [mysql]> select * from db where user='zj' \G ;
Empty set (0.00 sec)

und Sie können feststellen, dass die Spalte „select_priv“ der Benutzertabelle „Y“ ist, es jedoch keinen Datensatz in der Datenbanktabelle gibt Die gleichen Berechtigungen für alle Datenbanken erfordern keinen Eintrag in die Datenbanktabelle und müssen lediglich select_priv in der Benutzertabelle auf „Y“ ändern. Mit anderen Worten: Jede Berechtigung in der Benutzertabelle stellt Berechtigungen für alle Datenbanken dar.

3. Ändern Sie die Berechtigungen für zj@localhost, um nur Berechtigungen für alle Tabellen in der t2-Datenbank auszuwählen.

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

Zu diesem Zeitpunkt wurde festgestellt, dass sich select_priv in der Benutzertabelle in „N“ geändert hat und ein Datensatz mit db t2 zur db-Tabelle hinzugefügt wurde. Das heißt, wenn bestimmte Berechtigungen nur einem Teil der Datenbank gewährt werden, bleibt die entsprechende Berechtigungsspalte in der Benutzertabelle „N“ und die spezifischen Datenbankberechtigungen werden in die Datenbanktabelle geschrieben. Der Berechtigungsmechanismus von Tabellen und Spalten ähnelt dem von DB.

Wie aus dem obigen Beispiel ersichtlich ist, werden die Berechtigungen in der Reihenfolge Benutzer -> tables_priv -> zugewiesen Das heißt, die globalen Berechtigungen werden zuerst für den Tabellenbenutzer überprüft. Wenn die entsprechende Berechtigung im Benutzer „Y“ ist, ist die Berechtigung dieses Benutzers für alle Datenbanken „Y“ und db, tables_priv und columns_priv werden nicht mehr überprüft, wenn dies der Fall ist „N“, die Berechtigung dieses Benutzers wird in der Datenbanktabelle überprüft, die dem Benutzer entspricht, und erhält die Berechtigung „Y“ in der Datenbank, wenn die entsprechende Berechtigung in der Datenbank „N“ ist Berechtigungen in tables_priv und columns_priv nacheinander. Wenn alle „N“ sind, wird dies als „Keine Berechtigung“ beurteilt.

2. Kontoverwaltung

Beinhaltet hauptsächlich Kontoerstellung, Berechtigungsänderungen und Kontolöschung.

1. Erstellen Sie ein Konto

Erstellen Sie es mit der Grant-Syntax, Beispiel:

(1) Erstellen Sie den Benutzer zj mit Berechtigungen, die alle Berechtigungen für alle Datenbanken ausführen können und nur sein können auf den lokal über Connect zugegriffen werden kann.
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

Es kann festgestellt werden, dass mit Ausnahme der grant_priv-Berechtigung alle Berechtigungen in der Benutzertabelle „Y“ sind.

(2) Fügen Sie basierend auf (1) die Erteilungsberechtigung für zj hinzu
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) Legen Sie basierend auf (2) das Passwort auf „123“ fest
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

Sie können feststellen, dass das Passwort zu einer Reihe verschlüsselter Zeichenfolgen wird.

(4) Erstellen Sie einen neuen Benutzer zj2, der von jeder IP aus eine Verbindung herstellen kann. Die Berechtigungen bestehen darin, alle Tabellen in der t2-Datenbank auszuwählen, zu aktualisieren, einzufügen und zu löschen.
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
......

Die Berechtigungen in der Benutzertabelle sind alle „N“ und die Berechtigungen der in der Datenbanktabelle hinzugefügten Datensätze sind alle „Y“. Gewähren Sie Benutzern im Allgemeinen nur die entsprechenden Berechtigungen, ohne übermäßige Berechtigungen zu erteilen.

Die IP in diesem Beispiel ist auf alle IPs beschränkt, die eine Verbindung herstellen können, daher ist sie auf „*“ eingestellt. In der MySQL-Datenbank wird sie über das Hostfeld der Benutzertabelle gesteuert die folgenden Arten von Aufgaben.

  • Der Hostwert kann ein Hostname oder eine IP-Nummer sein, oder „localhost“ gibt den lokalen Host an.

  • Sie können die Platzhalterzeichen „%“ und „_“ im Wert der Hostspalte verwenden

  • Der Hostwert „%“ entspricht jedem Host Name, leere Hostwerte entsprechen „%“ und ihre Bedeutung ist dieselbe wie bei der Mustervergleichsoperation des Like-Operators.

注意: 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)

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

MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
(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)

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

2. 查看账号权限

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

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)

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

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 用户并不能删除用户。

4. 修改账号密码

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

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

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

5. 删除账号

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

drop user zj@localhost;

6. 账号资源限制

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

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

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

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

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








                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

Die Berechtigungstabelle von MySQL wird beim Start der Datenbank in den Speicher geladen. Wenn der Benutzer die Identitätsauthentifizierung besteht, wird auf die entsprechenden Berechtigungen im Speicher zugegriffen. Diese Benutzer können im Rahmen ihrer Befugnisse in der Datenbank verschiedene Vorgänge ausführen. 1. Zugriff auf Berechtigungstabellen In den beiden Prozessen des Berechtigungszugriffs verwendet das System die Datenbank „mysql“ (erstellt, wenn MySQL installiert ist, und der Datenbankname lautet „mysql“). ), sind die drei wichtigsten Berechtigungstabellen Benutzer, Host und Datenbank. Unter diesen 3 Tabellen ist die Benutzertabelle die wichtigste, gefolgt von der Datenbanktabelle. Die Hosttabelle wird in den meisten Fällen nicht verwendet. Die Spalten im Benutzer sind hauptsächlich in 4 Teile unterteilt: Benutzerspalten, Berechtigungsspalten, Sicherheitsspalten und Ressourcenkontrollspalten. ,

usw.


Wenn ein Benutzer eine Verbindung herstellt, umfasst der Zugriffsprozess der Berechtigungstabelle die folgenden zwei Prozesse:

Beginnen Sie zunächst mit dem Host, dem Benutzer und dem Kennwort in der Benutzertabelle . Felder werden verwendet, um festzustellen, ob die verbundene IP, der Benutzername und das Passwort in der Tabelle vorhanden sind. Wenn sie vorhanden sind, wird die Authentifizierung bestanden, andernfalls wird die Verbindung abgelehnt.

Wenn die Identitätsauthentifizierung bestanden wird, werden die Datenbankberechtigungen in der Reihenfolge der folgenden Berechtigungstabelle abgerufen: user -> tables_priv ->

In diesen Berechtigungstabellen nimmt der Umfang der Berechtigungen der Reihe nach ab und globale Berechtigungen decken lokale Berechtigungen ab. Die erste Stufe oben ist leicht zu verstehen. Lassen Sie uns die zweite Stufe anhand eines Beispiels im Detail erläutern. select_privsuper_privUm das Testen zu erleichtern, müssen Sie die Variable sql_mode ändern

// sql_mode 默认值中有 NO_AUTO_CREATE_USER (防止GRANT自动创建新用户,除非还指定了密码)
SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
1. Erstellen Sie den Benutzer zj@localhost und erteilen Sie ausgewählten Berechtigungen für alle Tabellen in allen Datenbanken
    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. Überprüfen Sie die Datenbanktabelle

    MySQL [mysql]> select * from db where user='zj' \G ;
    Empty set (0.00 sec)
    und Sie können feststellen, dass die Spalte „select_priv“ der Benutzertabelle „Y“ ist, es jedoch keinen Datensatz in der Datenbanktabelle gibt Die gleichen Berechtigungen für alle Datenbanken erfordern keinen Eintrag in die Datenbanktabelle und müssen lediglich select_priv in der Benutzertabelle auf „Y“ ändern. Mit anderen Worten: Jede Berechtigung in der Benutzertabelle stellt Berechtigungen für alle Datenbanken dar.
  • 3. Ändern Sie die Berechtigungen für zj@localhost, um nur Berechtigungen für alle Tabellen in der t2-Datenbank auszuwählen.

    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
    Zu diesem Zeitpunkt wurde festgestellt, dass sich select_priv in der Benutzertabelle in „N“ geändert hat und ein Datensatz mit db t2 zur db-Tabelle hinzugefügt wurde. Das heißt, wenn bestimmte Berechtigungen nur einem Teil der Datenbank gewährt werden, bleibt die entsprechende Berechtigungsspalte in der Benutzertabelle „N“ und die spezifischen Datenbankberechtigungen werden in die Datenbanktabelle geschrieben. Der Berechtigungsmechanismus von Tabellen und Spalten ähnelt dem von DB.
  • Wie aus dem obigen Beispiel ersichtlich ist, werden die Berechtigungen in der Reihenfolge Benutzer -> tables_priv -> zugewiesen Das heißt, die globalen Berechtigungen werden zuerst für den Tabellenbenutzer überprüft. Wenn die entsprechende Berechtigung im Benutzer „Y“ ist, ist die Berechtigung dieses Benutzers für alle Datenbanken „Y“ und db, tables_priv und columns_priv werden nicht mehr überprüft, wenn dies der Fall ist „N“, dann überprüfen Sie dies in der Datenbanktabelle. Die spezifische Datenbank, die dem Benutzer entspricht, und erhält die Berechtigung „Y“ in der Datenbank. Wenn die entsprechende Berechtigung in der Datenbank „N“ ist, überprüfen Sie die Berechtigungen in tables_priv und columns_priv wiederum: Wenn alle „N“ sind, wird dies als „Keine Berechtigung“ beurteilt.


    2. Kontoverwaltung Beinhaltet hauptsächlich Kontoerstellung, Berechtigungsänderungen und Kontolöschung.

    1. Erstellen Sie ein Konto

    Erstellen Sie es mit der Grant-Syntax, Beispiel:

    (1) Erstellen Sie den Benutzer zj mit Berechtigungen, die alle Berechtigungen für alle Datenbanken ausführen können und nur sein können Der lokale Zugriff erfolgt über Connect.

    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

    Es kann festgestellt werden, dass mit Ausnahme der grant_priv-Berechtigung alle Berechtigungen in der Benutzertabelle „Y“ sind.

    (2) Fügen Sie basierend auf (1) die Erteilungsberechtigung für zj hinzu

    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) Legen Sie basierend auf (2) das Passwort auf „123“ fest

    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

    Sie können feststellen, dass das Passwort zu einer Reihe verschlüsselter Zeichenfolgen wird.

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

    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)

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

    MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%';
    ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
    (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)

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

    2. 查看账号权限

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

    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)

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

    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 用户并不能删除用户。

    4. 修改账号密码

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

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

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

    5. 删除账号

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

    drop user zj@localhost;

    6. 账号资源限制

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

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

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

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

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


    • Wie führt MySQL die Berechtigungsverwaltung durch?



    你可能感兴趣的



    评论                                                    

    默认排序                        时间排序



    载入中...

    显示更多评论



    Das obige ist der detaillierte Inhalt vonWie führt MySQL die Berechtigungsverwaltung durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen