From 829aed32230270bc5ed6a2a236e072ac353e030c Mon Sep 17 00:00:00 2001 From: Lingyu Song Date: Mon, 25 May 2020 14:58:17 +0800 Subject: [PATCH 1/2] cherry pick #3202 to release-3.0 Signed-off-by: ti-srebot --- privilege-management.md | 99 +++++++++++++++++++++++++++++++---------- 1 file changed, 75 insertions(+), 24 deletions(-) diff --git a/privilege-management.md b/privilege-management.md index ea56608022bf..585c6166e773 100644 --- a/privilege-management.md +++ b/privilege-management.md @@ -94,6 +94,7 @@ SELECT user,host FROM mysql.user WHERE user='xxxx'; 上述示例中,`xxxx@%` 即自动添加的用户。 +<<<<<<< HEAD `GRANT` 对于数据库或者表的授权,不检查数据库或表是否存在。 {{< copyable "sql" >}} @@ -132,6 +133,9 @@ mysql> SELECT user,host FROM mysql.tables_priv WHERE user='xxxx'; ``` `GRANT` 可以模糊匹配地授予数据库和表: +======= +`GRANT` 还可以模糊匹配地授予用户数据库的权限: +>>>>>>> 47c6f1a... update document of privilege management (#3202) {{< copyable "sql" >}} @@ -246,39 +250,56 @@ Query OK, 0 rows affected (0.27 sec) SHOW GRANTS; ``` -查看某个特定用户的权限: +``` ++-------------------------------------------------------------+ +| Grants for User | ++-------------------------------------------------------------+ +| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION | ++-------------------------------------------------------------+ +``` + +或者: {{< copyable "sql" >}} ```sql -SHOW GRANTS for 'root'@'%'; +SHOW GRANTS FOR CURRENT_USER(); ``` -更精确的方式,可以通过直接查看授权表的数据实现。比如想知道,名为 `test@%` 的用户是否拥有对 `db1.t` 的 `Insert` 权限: +查看某个特定用户的权限: -1. 先查看该用户是否拥有全局 `Insert` 权限: +{{< copyable "sql" >}} - {{< copyable "sql" >}} +```sql +SHOW GRANTS FOR 'user'@'host'; +``` - ```sql - SELECT Insert_priv FROM mysql.user WHERE user='test' AND host='%'; - ``` +例如,创建一个用户 `rw_user@192.168.%` 并为其授予 `test.write_table` 表的写权限,和全局读权限。 -2. 如果没有,再查看该用户是否拥有 `db1` 数据库级别的 `Insert` 权限: +{{< copyable "sql" >}} - {{< copyable "sql" >}} +```sql +CREATE USER `rw_user`@`192.168.%`; +GRANT SELECT ON *.* TO `rw_user`@`192.168.%`; +GRANT INSERT, UPDATE ON `test`.`write_table` TO `rw_user`@`192.168.%`; +``` - ```sql - SELECT Insert_priv FROM mysql.db WHERE user='test' AND host='%'; - ``` +查看用户 `rw_user@192.168.%` 的权限。 -3. 如果仍然没有,则继续判断是否拥有 `db1.t` 这张表的 `Insert` 权限: +{{< copyable "sql" >}} - {{< copyable "sql" >}} +```sql +SHOW GRANTS FOR `rw_user`@`192.168.%`; +``` - ```sql - SELECT table_priv FROM mysql.tables_priv WHERE user='test' AND host='%' AND db='db1'; - ``` +``` ++------------------------------------------------------------------+ +| Grants for rw_user@192.168.% | ++------------------------------------------------------------------+ +| GRANT Select ON *.* TO 'rw_user'@'192.168.%' | +| GRANT Insert,Update ON test.write_table TO 'rw_user'@'192.168.%' | ++------------------------------------------------------------------+ +``` ## TiDB 各操作需要的权限 @@ -297,6 +318,8 @@ TiDB 用户目前拥有的权限可以在 `INFORMATION_SCHEMA.USER_PRIVILEGES` | Insert | InsertPriv | 插入数据到表 | | Update | UpdatePriv | 更新表中数据 | | Delete | DeletePriv | 删除表中数据 | +| Reload | ReloadPriv | 执行 `FLUSH` 语句 | +| Config | ConfigPriv | 动态加载配置 | | Trigger | TriggerPriv | 尚未使用 | | Process | ProcessPriv | 显示正在运行的任务 | | Execute | ExecutePriv | 执行 execute 语句 | @@ -321,7 +344,7 @@ TiDB 用户目前拥有的权限可以在 `INFORMATION_SCHEMA.USER_PRIVILEGES` ### CREATE DATABASE -需要对数据库拥有 `CREATE` 权限。 +需要拥有全局 `CREATE` 权限。 ### CREATE INDEX @@ -329,7 +352,7 @@ TiDB 用户目前拥有的权限可以在 `INFORMATION_SCHEMA.USER_PRIVILEGES` ### CREATE TABLE -需要对所操作的表拥有 `CREATE` 权限;若使用 `CREATE TABLE...LIKE...` 需要对相关的表拥有 `SELECT` 权限。 +需要对要创建的表所在的数据库拥有 `CREATE` 权限;若使用 `CREATE TABLE...LIKE...` 需要对相关的表拥有 `SELECT` 权限。 ### CREATE VIEW @@ -351,6 +374,10 @@ TiDB 用户目前拥有的权限可以在 `INFORMATION_SCHEMA.USER_PRIVILEGES` 需要对所操作的表拥有 `DROP` 权限。 +### LOAD DATA + +`LOAD DATA` 需要对所操作的表拥有 `INSERT` 权限。 + ### TRUNCATE TABLE 需要对所操作的表拥有 `DROP` 权限。 @@ -369,6 +396,8 @@ TiDB 用户目前拥有的权限可以在 `INFORMATION_SCHEMA.USER_PRIVILEGES` `SHOW CREATE VIEW` 需要 `SHOW VIEW` 权限。 +`SHOW GRANTS` 需要拥有对 `mysql` 数据库的 `SELECT` 权限。如果是使用 `SHOW GRANTS` 查看当前用户权限,则不需要任何权限。 + ### CREATE ROLE/USER `CREATE ROLE` 需要 `CREATE ROLE` 权限。 @@ -377,21 +406,43 @@ TiDB 用户目前拥有的权限可以在 `INFORMATION_SCHEMA.USER_PRIVILEGES` ### DROP ROLE/USER -`DROP ROLE` 需要 `DROPROLE` 权限。 +`DROP ROLE` 需要 `DROP ROLE` 权限。 -`DROP USER` 需要 `CREATEUSER` 权限 +`DROP USER` 需要 `CREATE USER` 权限 ### ALTER USER -`ALTER USER` 需要 `CREATEUSER` 权限。 +`ALTER USER` 需要 `CREATE USER` 权限。 ### GRANT `GRANT` 需要 `GRANT` 权限并且拥有 `GRANT` 所赋予的权限。 +如果在 `GRANTS` 语句中创建用户,需要有 `CREATE USER` 权限。 + +`GRANT ROLE` 操作需要拥有 `SUPER` 权限。 + ### REVOKE -`REVOKE` 需要 `SUPER` 权限。 +`REVOKE` 需要 `GRANT` 权限并且拥有 `REVOKE` 所指定要撤销的权限。 + +`REVOKE ROLE` 操作需要拥有 `SUPER` 权限。 + +### SET GLOBAL + +使用 `SET GLOBAL` 设置全局变量需要拥有 `SUPER` 权限。 + +### ADMIN + +需要拥有 `SUPER` 权限。 + +### SET DEFAULT ROLE + +需要拥有 `SUPER` 权限。 + +### KILL + +使用 `KILL` 终止其他用户的会话需要拥有 `SUPER` 权限。 ## 权限系统的实现 From 8ab871248c5cbda61f2b8537f468a7b3ca3ac897 Mon Sep 17 00:00:00 2001 From: imtbkcat Date: Wed, 24 Jun 2020 14:19:37 +0800 Subject: [PATCH 2/2] resolve --- privilege-management.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/privilege-management.md b/privilege-management.md index 585c6166e773..1b3ed67426f8 100644 --- a/privilege-management.md +++ b/privilege-management.md @@ -94,7 +94,6 @@ SELECT user,host FROM mysql.user WHERE user='xxxx'; 上述示例中,`xxxx@%` 即自动添加的用户。 -<<<<<<< HEAD `GRANT` 对于数据库或者表的授权,不检查数据库或表是否存在。 {{< copyable "sql" >}} @@ -132,10 +131,7 @@ mysql> SELECT user,host FROM mysql.tables_priv WHERE user='xxxx'; 1 row in set (0.00 sec) ``` -`GRANT` 可以模糊匹配地授予数据库和表: -======= `GRANT` 还可以模糊匹配地授予用户数据库的权限: ->>>>>>> 47c6f1a... update document of privilege management (#3202) {{< copyable "sql" >}}