Heim > Datenbank > MySQL-Tutorial > Hauptteil

Lassen Sie uns über Konten und Berechtigungen in MySQL sprechen

WBOY
Freigeben: 2022-01-14 17:13:00
nach vorne
2352 Leute haben es durchsucht

In diesem Artikel werden Probleme im Zusammenhang mit Kontoberechtigungen in MySQL behandelt. Wenn ein Benutzer einen Datenbankvorgang ausführt, überprüft der Server, ob der Benutzer über die entsprechenden Berechtigungen verfügt. Zum Abfragen einer Tabelle sind beispielsweise SELECT-Berechtigungen erforderlich, und zum Löschen von Objekten sind DROP-Berechtigungen erforderlich. Ich hoffe, es hilft allen.

Lassen Sie uns über Konten und Berechtigungen in MySQL sprechen

Wenn der Client eine Verbindung zum MySQL-Server herstellt, muss er eine gültige Authentifizierung wie Benutzername und Passwort bereitstellen. Wenn ein Benutzer eine Datenbankoperation ausführt, überprüft der Server, ob der Benutzer über die entsprechenden Berechtigungen verfügt. Zum Abfragen einer Tabelle sind beispielsweise SELECT-Berechtigungen erforderlich, und zum Löschen von Objekten sind DROP-Berechtigungen erforderlich.

Um die Verwaltung von Benutzerberechtigungen zu erleichtern, bietet MySQL 8.0 die Rollenfunktion. Eine Rolle ist eine Sammlung von Berechtigungen.

Lassen Sie uns über Konten und Berechtigungen in MySQL sprechen

In diesem Artikel besprechen wir die Verwaltung von Konten und Berechtigungen in MySQL.

5.1 Benutzer verwalten

5.1.1 Benutzer erstellen

MySQL verwendet die CREATE USER-Anweisung, um Benutzer zu erstellen:

CREATE USER [IF NOT EXISTS] account_name
IDENTIFIED BY 'password';
Nach dem Login kopieren

Dabei ist account_name der Kontoname Der Kontoname ist in zwei Teile unterteilt: Benutzername (user_name) und Hostname (host_name). Verwenden Sie % zum Herstellen einer Verbindung. IDENTIFIED BY wird verwendet, um das Passwort des Benutzers anzugeben. IF NOT EXISTS wird verwendet, um Fehlermeldungen beim Erstellen von Konten mit demselben Namen zu vermeiden.

Die folgende Anweisung erstellt einen neuen Benutzer dev01, der sich von diesem Computer (localhost) aus anmelden kann:

mysql> CREATE USER dev01@localhost IDENTIFIED BY 'Dev01@mysql';
Query OK, 0 rows affected (0.21 sec)
Nach dem Login kopieren

Das Konto in MySQL wird durch den Benutzernamen und den Hostnamen bestimmt, dev01 auf dem Host office.example.com und der host home.example dev01 auf .com sind zwei Konten. Wenn der Hostname nicht angegeben ist, bedeutet dies, dass sich der Benutzer von jedem Host aus anmelden kann:

user_name
user_name@%
Nach dem Login kopieren

% ist ein Platzhalterzeichen, das eine beliebige Zeichenfolge darstellt, außerdem steht _ für ein beliebiges einzelnes Zeichen.

Wenn der Benutzername oder Hostname Sonderzeichen wie Leerzeichen oder - enthält, müssen Sie Anführungszeichen verwenden, um die beiden Teile jeweils in Anführungszeichen zu setzen:

'user-name'@'host-name'
Nach dem Login kopieren

Zusätzlich zu einfachen Anführungszeichen können Sie auch Backticks (`) oder doppelte Anführungszeichen verwenden Anführungszeichen (" ).

Kontoinformationen in MySQL werden in der Benutzertabelle der Systemdatenbank mysql gespeichert:

mysql> select host, user from mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | dev01            |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
5 rows in set (0.00 sec)
Nach dem Login kopieren

Mit Ausnahme von dev01@localhost sind die anderen 4 Benutzer initialisierte Systembenutzer

Zusätzlich zur grundlegenden Syntax, Erstellen. Benutzer können auch weitere Optionen angeben:

resource_option: {
    MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}
Nach dem Login kopieren

resource_option wird verwendet, um die Nutzung von Systemressourcen durch den Benutzer zu begrenzen:

  • MAX_QUERIES_PER_HOUR, die Anzahl der Abfragen, die pro Stunde ausgeführt werden dürfen, der Standardwert ist 0, was bedeutet, dass es keine Begrenzung gibt;

  • MAX_UPDATES_PER_HOUR, die Anzahl der erlaubten Updates pro Stunde. Der Standardwert ist 0, was bedeutet, dass es keine Begrenzung gibt MAX_USER_CONNECTIONS, die gleichzeitigen Verbindungen des Benutzers. Der Standardwert ist 0, was bedeutet, dass die Anzahl der gleichzeitigen Verbindungen des Benutzers durch die Systemvariable max_user_connections bestimmt wird. Die folgende Anweisung erstellt ein neues Konto dev02, das dies zulässt Benutzer können sich höchstens pro Stunde von einem beliebigen Host aus anmelden.

    mysql> CREATE USER 'dev02'@'%'
        -> WITH MAX_QUERIES_PER_HOUR 1000 MAX_UPDATES_PER_HOUR 100;
    Query OK, 0 rows affected (0.01 sec)
    Nach dem Login kopieren
  • Beachten Sie, dass in der zweiten Zeile die Eingabeaufforderung angezeigt wird Einstellungen:
  • mysql> select host, user, max_questions, max_updates from mysql.user;
    +-----------+------------------+---------------+-------------+
    | host      | user             | max_questions | max_updates |
    +-----------+------------------+---------------+-------------+
    | %         | dev02            |          1000 |         100 |
    | localhost | dev01            |             0 |           0 |
    | localhost | mysql.infoschema |             0 |           0 |
    | localhost | mysql.session    |             0 |           0 |
    | localhost | mysql.sys        |             0 |           0 |
    | localhost | root             |             0 |           0 |
    +-----------+------------------+---------------+-------------+
    6 rows in set (0.00 sec)
    Nach dem Login kopieren

    Die folgenden Passwortverwaltungsoptionen sind:

    password_option: {
        PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]
      | PASSWORD HISTORY {DEFAULT | N}
      | PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
      | PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
    }
    Nach dem Login kopieren
  • Passwortverwaltungsoptionen können zum Festlegen von Passwortablaufrichtlinien, zur Wiederverwendung von Richtlinien und zur Überprüfung beim Ändern von Passwörtern verwendet werden:
  • PASSWORT ABLÄUFT, legt fest, dass das Passwort sofort abläuft; PASSWORT EXPIRE DEFAULT, verwenden Sie die vom System gesteuerte globale Passwortablaufrichtlinie. Bestimmt durch die Variable default_password_lifetime; PASSWORD EXPIRE NEVER, das Passwort läuft nie ab; PASSWORD EXPIRE INTERVAL N DAY, das Passwort läuft alle N Tage ab; STANDARD: Verwenden Sie die globale Richtlinie zur Wiederverwendung von Passwörtern, die durch die Systemvariable „password_history“ bestimmt wird. N, Das neue Passwort kann nicht mit den letzten N Passwörtern wiederholt werden zum Zeitintervall), bestimmt durch die Systemvariable „password_reuse_interval“; PASSWORD REUSE INTERVAL N DAY, das neue Passwort mit den letzten N Tagen. Das Passwort kann nicht wiederholt werden.

PASSWORD REQUIRE CURRENT, der Benutzer muss das aktuelle Passwort eingeben Ändern des Passworts; PASSWORD REQUIRE CURRENT OPTIONAL, der Benutzer muss beim Ändern des Passworts nicht das aktuelle Passwort eingeben, verwendet die globale Richtlinie und wird durch die Systemvariable „password_require_current“ bestimmt.

Die Passwortoptionen des Kontos können auch über die mysql.user-Tabelle angezeigt werden:

mysql> select host,user,
    -> password_expired, password_last_changed,
    -> password_lifetime, password_reuse_history,
    -> password_reuse_time, password_require_current
    -> from mysql.user;
+-----------+------------------+------------------+-----------------------+-------------------+------------------------+---------------------+--------------------------+
| host      | user             | password_expired | password_last_changed | password_lifetime | password_reuse_history | password_reuse_time | password_require_current |
+-----------+------------------+------------------+-----------------------+-------------------+------------------------+---------------------+--------------------------+
| %         | dev02            | N                | 2019-09-23 15:02:47   |              NULL |                   NULL |                NULL | NULL                     |
| localhost | dev01            | N                | 2019-09-23 14:23:39   |              NULL |                   NULL |                NULL | NULL                     |
| localhost | mysql.infoschema | N                | 2019-08-28 10:07:39   |              NULL |                   NULL |                NULL | NULL                     |
| localhost | mysql.session    | N                | 2019-08-28 10:07:39   |              NULL |                   NULL |                NULL | NULL                     |
| localhost | mysql.sys        | N                | 2019-08-28 10:07:39   |              NULL |                   NULL |                NULL | NULL                     |
| localhost | root             | N                | 2019-08-28 10:07:44   |              NULL |                   NULL |                NULL | NULL                     |
+-----------+------------------+------------------+-----------------------+-------------------+------------------------+---------------------+--------------------------+
6 rows in set (0.00 sec)
Nach dem Login kopieren
    Die folgenden Kontosperroptionen sind:
  • lock_option: {
        ACCOUNT LOCK
      | ACCOUNT UNLOCK
    }
    Nach dem Login kopieren

    Mit dieser Option wird angegeben, ob das Konto gesperrt werden soll kann nicht verwendet werden; die Standardeinstellung ist KONTO ENTSPERREN, nicht Konto sperren.

  • 5.1.2 Benutzer ändern

  • Die ALTER USER-Anweisung kann die Attribute des Benutzers ändern. Die Optionen zum Ändern des Benutzers sind dieselben wie zum Erstellen des Benutzers.

  • Der erste Schritt besteht darin, das Passwort des Benutzers zu ändern. Die folgende Anweisung wird verwendet, um das Passwort des Benutzers dev01 zu ändern:
  • mysql> ALTER USER dev01@localhost IDENTIFIED BY 'Dev01@2019';
    Query OK, 0 rows affected (0.25 sec)
    Nach dem Login kopieren

    MySQL 提供了 RENAME USER 语句,用于修改用户名:

    mysql> RENAME USER dev02 TO dev03;
    Query OK, 0 rows affected (0.26 sec)
    Nach dem Login kopieren

    用户 dev02 被重命名为 dev03。

    RENAME USER 语句自动将旧用户的权限授予新用户,但是不会自动解决旧用户上的对象依赖。例如,某个存储过程的定义者为旧的用户名,并且使用定义者权限运行时,将会产生错误。

    另一个常见的用户修改操作就是锁定账户和解锁账户:

    mysql> ALTER USER dev01@localhost ACCOUNT LOCK;
    Query OK, 0 rows affected (0.13 sec)
    Nach dem Login kopieren

    用户 dev01 被锁定,此时无法使用该用户进行连接:

    "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u dev01 -p
    Enter password: **********
    ERROR 3118 (HY000): Access denied for user 'dev01'@'localhost'. Account is locked.
    Nach dem Login kopieren

    系统变量 Locked_connects 用于记录锁定账户尝试登录的次数:

    mysql> SHOW GLOBAL STATUS LIKE 'Locked_connects';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | Locked_connects | 1     |
    +-----------------+-------+
    1 row in set (0.00 sec)
    Nach dem Login kopieren

    最后我们将 dev01 进行解锁:

    mysql> ALTER USER dev01@localhost ACCOUNT UNLOCK;
    Query OK, 0 rows affected (0.10 sec)
    Nach dem Login kopieren

    5.1.3 删除用户

    DROP USER 语句用于删除一个用户。以下语句将会删除用 dev03:

    mysql> DROP USER dev03;
    Query OK, 0 rows affected (0.14 sec)
    Nach dem Login kopieren

    如果被删除的用户已经连接到 MySQL 服务器,用户可以继续执行操作;但是无法建立新的连接。

    5.2 管理权限

    新创建的用户默认只有 USAGE 权限,只能连接数据库,而没有任何操作权限。使用 SHOW GRANTS 命令可以查看用户的权限:

    mysql> SHOW GRANTS FOR dev01@localhost;
    +-------------------------------------------+
    | Grants for dev01@localhost                |
    +-------------------------------------------+
    | GRANT USAGE ON *.* TO `dev01`@`localhost` |
    +-------------------------------------------+
    1 row in set (0.00 sec)
    Nach dem Login kopieren

    使用 GRANT 语句可以为用户授予权限。

    5.2.1 授予权限

    GRANT 语句基本语法如下:

    GRANT privilege, ... 
    ON privilege_level 
    TO account_name;
    Nach dem Login kopieren

    GRANT 语句支持一次授予多个权限,使用逗号进行分隔。

    privilege_level 指定权限的作用级别,包括:

    • 全局权限,作用于 MySQL 服务器中的所有数据库。全局权限使用*.*表示,例如,以下语句授予 dev01@localhost 用户查询所有数据库中的所有表的权限:

    mysql> GRANT SELECT
       -> ON *.*
       -> TO dev01@localhost;
    Query OK, 0 rows affected (0.01 sec)
    mysql> SHOW GRANTS FOR dev01@localhost;
    +--------------------------------------------+
    | Grants for dev01@localhost                 |
    +--------------------------------------------+
    | GRANT SELECT ON *.* TO `dev01`@`localhost` |
    +--------------------------------------------+
    1 row in set (0.00 sec)
    Nach dem Login kopieren

    全局权限存储在 mysql.user 表中。

    • 数据库权限,作用于指定数据库中的所有对象。数据库权限使用db_name.*表示,例如,以下语句授予 dev01@localhost 用户查询数据库 world 中的所有表的权限:

    mysql> GRANT ALL
        -> ON world.*
        -> TO dev01@localhost;
    Query OK, 0 rows affected (0.01 sec)
    mysql> SHOW GRANTS FOR dev01@localhost;
    +----------------------------------------------------------+
    | Grants for dev01@localhost                               |
    +----------------------------------------------------------+
    | GRANT SELECT ON *.* TO `dev01`@`localhost`               |
    | GRANT ALL PRIVILEGES ON `world`.* TO `dev01`@`localhost` |
    +----------------------------------------------------------+
    2 rows in set (0.00 sec)
    Nach dem Login kopieren

    数据库权限存储在 mysql.db 表中。

    • 表权限,作用于指定表的所有列。数据库权限使用db_name.table_name表示;如果不指定 db_name,使用默认数据库;如果没有默认数据库,将会返回错误。例如,以下语句授予 dev01@localhost 用户数据库 world 中country 表的增删改查权限:

    mysql> GRANT SELECT, INSERT, UPDATE, DELETE
        -> ON world.country
        -> TO dev01@localhost;
    Query OK, 0 rows affected (0.01 sec)
    mysql> SHOW GRANTS FOR dev01@localhost;
    +----------------------------------------------------------------------------------+
    | Grants for dev01@localhost                                                       |
    +----------------------------------------------------------------------------------+
    | GRANT SELECT ON *.* TO `dev01`@`localhost`                                       |
    | GRANT ALL PRIVILEGES ON `world`.* TO `dev01`@`localhost`                         |
    | GRANT SELECT, INSERT, UPDATE, DELETE ON `world`.`country` TO `dev01`@`localhost` |
    +----------------------------------------------------------------------------------+
    3 rows in set (0.00 sec)
    Nach dem Login kopieren

    表权限存储在 mysql.tables_priv 表中。

    • 列权限,作用于指定表的指定列。每个列权限都需要指定具体的列名。例如,以下语句授予 dev01@localhost 用户在 world.country 表中 code 和 name 字段的查询权限,以及 population 字段的修改权限:

    mysql> GRANT SELECT(code, name), UPDATE(population)
        -> ON world.country
        -> TO dev01@localhost;
    Query OK, 0 rows affected (0.01 sec)
    mysql> SHOW GRANTS FOR dev01@localhost;
    +----------------------------------------------------------------------------------------------------------------------------------+
    | Grants for dev01@localhost |
    +----------------------------------------------------------------------------------------------------------------------------------+
    | GRANT SELECT ON *.* TO `dev01`@`localhost` |
    | GRANT ALL PRIVILEGES ON `world`.* TO `dev01`@`localhost` |
    | GRANT SELECT, SELECT (`code`, `name`), INSERT, UPDATE, UPDATE (`population`), DELETE ON `world`.`country` TO `dev01`@`localhost` |
    +----------------------------------------------------------------------------------------------------------------------------------+
    3 rows in set (0.00 sec)
    Nach dem Login kopieren

    列权限存储在 mysql.columns_priv 表中。

    • 存储例程权限,作用于存储例程(函数和过程)。存储例程权限可以基于全局、数据库或者单个例程进行指定。以下语句授予 dev01@localhost 用户在数据库 world.country 中创建存储例程的权限:

    mysql> GRANT CREATE ROUTINE
        -> ON world.*
        -> TO dev01@localhost;
    Query OK, 0 rows affected (0.02 sec)
    mysql> SHOW GRANTS FOR dev01@localhost;
    +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Grants for dev01@localhost |
    +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | GRANT SELECT ON *.* TO `dev01`@`localhost`|
    | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, ALTER ROUTINE, EVENT, TRIGGER ON `world`.* TO `dev01`@`localhost` |
    | GRANT SELECT, SELECT (`code`, `name`), INSERT, UPDATE, UPDATE (`population`), DELETE ON `world`.`country` TO `dev01`@`localhost` |
    +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    3 rows in set (0.00 sec)
    Nach dem Login kopieren

    存储例程权限存储在 mysql.procs_priv 表中。

    • 代理用户权限,允许用户作为其他用户的代理。代理用户拥有被代理用户的所有权限。以下语句将 dev01@localhost 用户设置为 root 用的代理:

    mysql> GRANT PROXY
        -> ON root
        -> TO dev01@localhost;
    Query OK, 0 rows affected (0.01 sec)
    mysql> SHOW GRANTS FOR dev01@localhost;
    +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Grants for dev01@localhost |
    +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | GRANT SELECT ON *.* TO `dev01`@`localhost` |
    | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, ALTER ROUTINE, EVENT, TRIGGER ON `world`.* TO `dev01`@`localhost` |
    | GRANT SELECT, SELECT (`code`, `name`), INSERT, UPDATE, UPDATE (`population`), DELETE ON `world`.`country` TO `dev01`@`localhost` |
    | GRANT PROXY ON 'root'@'%' TO 'dev01'@'localhost' |
    +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    4 rows in set (0.00 sec)
    Nach dem Login kopieren

    代理用户权限存储在 mysql.proxies_priv 表中。

    5.2.2 撤销权限

    REVOKE 语句执行与 GRANT 语句相反的操作,撤销授予用户的权限。

    REVOKE privilegee, ..
    ON privilege_level
    FROM account_name;
    Nach dem Login kopieren

    撤销权限的参数与授予权限时类似,以下语句撤销用户 dev01@localhost 所有的权限:

    mysql> REVOKE ALL, GRANT OPTION
        -> FROM dev01@localhost;
    Query OK, 0 rows affected (0.01 sec)
    mysql> SHOW GRANTS FOR dev01@localhost;
    +--------------------------------------------------+
    | Grants for dev01@localhost                       |
    +--------------------------------------------------+
    | GRANT USAGE ON *.* TO `dev01`@`localhost`        |
    | GRANT PROXY ON 'root'@'%' TO 'dev01'@'localhost' |
    +--------------------------------------------------+
    2 rows in set (0.00 sec)
    Nach dem Login kopieren

    代理用户权限需要单独撤销:

    mysql> REVOKE PROXY
        -> ON root
        -> FROM dev01@localhost;
    Query OK, 0 rows affected (0.01 sec)
    mysql> SHOW GRANTS FOR dev01@localhost;
    +-------------------------------------------+
    | Grants for dev01@localhost                |
    +-------------------------------------------+
    | GRANT USAGE ON *.* TO `dev01`@`localhost` |
    +-------------------------------------------+
    1 row in set (0.00 sec)
    Nach dem Login kopieren

    用户 dev01@localhost 又恢复了初始的权限。

    对于全局级别的权限,REVOKE 的效果在用户下次登录时生效;对于数据库级别的权限,REVOKE 的效果在执行 USE 命令后生效;对于表级或者字段级别的权限,REVOKE 的效果随后的查询立即生效。

    5.3 管理角色

    当用户越来越多时,权限的管理也越来越复杂;而实际上,许多用户需要相同或类似的权限。为此,MySQL 8.0 引入了一个新的特性:角色(Role)。角色是一组权限的集合。

    与账户类似,角色也可以授予权限;但是角色不能用于登录数据库。通过角色为用户授权的步骤如下:

    • 创建一个角色;

    • 为角色授权权限;

    • 为用户指定角色。

    5.3.1 创建角色

    假设我们的应用需要使用 world 数据库。开发人员需要该数据库的完全访问权限,测试人员需要表的读写权限,业务分析人员需要查询数据的权限。

    首先,使用CREATE ROLE语句创建 3 个角色:

    mysql> CREATE ROLE devp_role, read_role, write_role;
    Query OK, 0 rows affected (0.02 sec)
    Nach dem Login kopieren

    角色名称和账户名称类似,也可以包含 role_name 和 host_name 两部分,使用 @ 连接。

    此时如果查询用户表:

    mysql> SELECT host,user,authentication_string FROM mysql.user;
    +-----------+------------------+------------------------------------------------------------------------+
    | host      | user             | authentication_string                                                  |
    +-----------+------------------+------------------------------------------------------------------------+
    | %         | devp_role        |                                                                        |
    | %         | read_role        |                                                                        |
    | %         | write_role       |                                                                        |
    | localhost | dev01            | $A$005$lw58QcU;QI|L`ktULChFhIVFxy5dsYrYmEhJkJqko4mezqefUFyT0zgyE2 |
    | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
    | localhost | mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
    | localhost | mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
    | localhost | root             | $A$005$kDqbW(q*0Uev;TyKgUe56D9KXiFzPtrSGVxKjvM23CYN5pgE9dLrO0eT8 |
    +-----------+------------------+------------------------------------------------------------------------+
    8 rows in set (0.00 sec)
    Nach dem Login kopieren

    可以看出,角色实际上也是一个用户,但是没有密码。

    5.3.2 为角色授权

    为角色授权和用户授权类似,也是使用 GRANT 语句。我们分别为上面的 3 个角色分配权限:

    mysql> GRANT ALL ON world.* TO devp_role;
    Query OK, 0 rows affected (0.01 sec)
    mysql> GRANT SELECT ON world.* TO read_role;
    Query OK, 0 rows affected (0.01 sec)
    mysql> GRANT INSERT, UPDATE, DELETE ON world.* TO write_role;
    Query OK, 0 rows affected (0.01 sec)
    Nach dem Login kopieren

    查看角色的权限和查询用户的权限类似:

    mysql> SHOW GRANTS FOR devp_role;
    +------------------------------------------------------+
    | Grants for devp_role@%                               |
    +------------------------------------------------------+
    | GRANT USAGE ON *.* TO `devp_role`@`%`                |
    | GRANT ALL PRIVILEGES ON `world`.* TO `devp_role`@`%` |
    +------------------------------------------------------+
    2 rows in set (0.00 sec)
    Nach dem Login kopieren

    5.3.2 为用户指定角色

    接下来我们创建几个用户,然后为他们分别指定角色。

    mysql> CREATE USER devp1 IDENTIFIED BY 'Devp1@2019';
    Query OK, 0 rows affected (0.01 sec)
    mysql> CREATE USER read1 IDENTIFIED BY 'Read1@2019';
    Query OK, 0 rows affected (0.01 sec)
    mysql> CREATE USER test1 IDENTIFIED BY 'Test1@2019';
    Query OK, 0 rows affected (0.04 sec)
    Nach dem Login kopieren

    为用户指定角色和授予权限类似,也是使用GRANT语句:

    mysql> GRANT devp_role TO devp1;
    Query OK, 0 rows affected (0.01 sec)
    mysql> GRANT read_role TO read1;
    Query OK, 0 rows affected (0.01 sec)
    mysql> GRANT read_role, write_role TO test1;
    Query OK, 0 rows affected (0.01 sec)
    Nach dem Login kopieren

    再次查询用户的权限:

    mysql> SHOW GRANTS FOR devp1;
    +--------------------------------------+
    | Grants for devp1@%                   |
    +--------------------------------------+
    | GRANT USAGE ON *.* TO `devp1`@`%`    |
    | GRANT `devp_role`@`%` TO `devp1`@`%` |
    +--------------------------------------+
    2 rows in set (0.00 sec)
    Nach dem Login kopieren

    如果想要知道用户通过角色获得的具体权限,可以使用USING选项:

    mysql> SHOW GRANTS FOR devp1 USING devp_role;
    +--------------------------------------------------+
    | Grants for devp1@%                               |
    +--------------------------------------------------+
    | GRANT USAGE ON *.* TO `devp1`@`%`                |
    | GRANT ALL PRIVILEGES ON `world`.* TO `devp1`@`%` |
    | GRANT `devp_role`@`%` TO `devp1`@`%`             |
    +--------------------------------------------------+
    3 rows in set (0.00 sec)
    Nach dem Login kopieren

    另外,也可以通过将一个用户授予另一个用户,实现权限的复制:

    mysql> GRANT read1 TO test1;
    Query OK, 0 rows affected (0.09 sec)
    Nach dem Login kopieren

    用户是具有登录权限的角色,角色是不能登录的用户。

    5.3.4 设置默认角色

    使用 devp1 连接数据库:

    "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u devp1 -p
    Enter password: **********
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 14
    Server version: 8.0.17 MySQL Community Server - GPL
    Copyright (c) 2000, 2019, 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> use world;
    ERROR 1044 (42000): Access denied for user 'devp1'@'%' to database 'world'
    Nach dem Login kopieren

    我们已经为用户 devp1 授予了 devp_role 角色,该角色拥有数据库 world 上的所有权限;错误的原因在于该角色没有自动激活。使用CURRENT_ROLE()函数查看当前启动的角色:

    mysql> SELECT current_role();
    +----------------+
    | current_role() |
    +----------------+
    | NONE           |
    +----------------+
    1 row in set (0.00 sec)
    Nach dem Login kopieren

    结果显示没有任何角色。SET DEFAULT ROLE命令可以设置用户默认的活动角色:

    mysql> SET DEFAULT ROLE ALL
        -> TO devp1;
    Query OK, 0 rows affected (0.01 sec)
    Nach dem Login kopieren

    再次使用 devp1 连接数据库后,将会激活该用户所有的角色:

    "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u devp1 -p
    Enter password: **********
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 15
    Server version: 8.0.17 MySQL Community Server - GPL
    Copyright (c) 2000, 2019, 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> SELECT current_role();
    +-----------------+
    | current_role()  |
    +-----------------+
    | `devp_role`@`%` |
    +-----------------+
    1 row in set (0.00 sec)
    mysql> use world;
    Database changed
    mysql> select * from city limit 1;
    +----+-------+-------------+----------+------------+
    | ID | Name  | CountryCode | District | Population |
    +----+-------+-------------+----------+------------+
    |  1 | Kabul | AFG         | Kabol    |    1780000 |
    +----+-------+-------------+----------+------------+
    1 row in set (0.00 sec)
    Nach dem Login kopieren

    另一种方式就是使用SET ROLE命令设置当前会话的活动角色:

    SET ROLE NONE;
    SET ROLE ALL;
    SET ROLE DEFAULT;
    Nach dem Login kopieren

    以上语句分别表示不设置任何角色、设置所有角色以及设置默认的角色。

    5.3.5 撤销角色的权限

    撤销角色的权限与撤销用户的权限类似,撤销角色的权限同时会影响到具有该角色的用户。

    以下语句撤销角色 write_role 的 DELETE 权限:

    mysql> REVOKE DELETE
        -> ON world.*
        -> FROM write_role;
    Query OK, 0 rows affected (0.14 sec)
    Nach dem Login kopieren

    此时,用户 test1 上的相应权限也被撤销。

    5.3.6 删除角色

    DROP ROLE语句可以删除角色:

    DROP ROLE role_name, ...;
    Nach dem Login kopieren

    删除角色的同时会撤销为用户指定的角色。以下语句将会删除角色 read_role 和 write_role:

    mysql> DROP ROLE read_role, write_role;
    Query OK, 0 rows affected (0.10 sec)
    Nach dem Login kopieren

    推荐学习:mysql视频教程

    Das obige ist der detaillierte Inhalt vonLassen Sie uns über Konten und Berechtigungen in MySQL sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.im
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage