- 关于 TiDB
- 快速上手
- 应用开发
- 概览
- 快速开始
- 使用 TiDB Cloud (DevTier) 构建 TiDB 集群
- 使用 TiDB 的增删改查 SQL
- TiDB 的简单 CRUD 应用程序
- 示例程序
- 连接到 TiDB
- 数据库模式设计
- 数据写入
- 数据读取
- 事务
- 优化 SQL 性能
- 故障诊断
- 引用文档
- 云原生开发环境
- 部署标准集群
- 数据迁移
- 运维操作
- 监控与告警
- 故障诊断
- 性能调优
- 优化手册
- 配置优化
- SQL 性能调优
- SQL 性能调优概览
- 理解 TiDB 执行计划
- SQL 优化流程
- 控制执行计划
- 教程
- 同城多中心部署
- 两地三中心部署
- 同城两中心部署
- 读取历史数据
- 使用 Stale Read 功能读取历史数据(推荐)
- 使用系统变量
tidb_snapshot
读取历史数据
- 最佳实践
- Placement Rules 使用文档
- Load Base Split 使用文档
- Store Limit 使用文档
- TiDB 工具
- 功能概览
- 适用场景
- 工具下载
- TiUP
- 文档地图
- 概览
- 术语及核心概念
- TiUP 组件管理
- FAQ
- 故障排查
- TiUP 命令参考手册
- 命令概览
- TiUP 命令
- TiUP Cluster 命令
- TiUP Cluster 命令概览
- tiup cluster audit
- tiup cluster check
- tiup cluster clean
- tiup cluster deploy
- tiup cluster destroy
- tiup cluster disable
- tiup cluster display
- tiup cluster edit-config
- tiup cluster enable
- tiup cluster help
- tiup cluster import
- tiup cluster list
- tiup cluster patch
- tiup cluster prune
- tiup cluster reload
- tiup cluster rename
- tiup cluster replay
- tiup cluster restart
- tiup cluster scale-in
- tiup cluster scale-out
- tiup cluster start
- tiup cluster stop
- tiup cluster template
- tiup cluster upgrade
- TiUP DM 命令
- TiUP DM 命令概览
- tiup dm audit
- tiup dm deploy
- tiup dm destroy
- tiup dm disable
- tiup dm display
- tiup dm edit-config
- tiup dm enable
- tiup dm help
- tiup dm import
- tiup dm list
- tiup dm patch
- tiup dm prune
- tiup dm reload
- tiup dm replay
- tiup dm restart
- tiup dm scale-in
- tiup dm scale-out
- tiup dm start
- tiup dm stop
- tiup dm template
- tiup dm upgrade
- TiDB 集群拓扑文件配置
- DM 集群拓扑文件配置
- TiUP 镜像参考指南
- TiUP 组件文档
- PingCAP Clinic 诊断服务 (Technical Preview)
- TiDB Operator
- Dumpling
- TiDB Lightning
- TiDB Data Migration
- 关于 Data Migration
- 快速开始
- 部署 DM 集群
- 入门指南
- 进阶教程
- 运维管理
- 参考手册
- 使用示例
- 异常解决
- 版本发布历史
- Backup & Restore (BR)
- TiDB Binlog
- TiCDC
- sync-diff-inspector
- TiSpark
- 参考指南
- 架构
- 监控指标
- 安全加固
- 权限
- SQL
- SQL 语言结构和语法
- SQL 语句
ADD COLUMN
ADD INDEX
ADMIN
ADMIN CANCEL DDL
ADMIN CHECKSUM TABLE
ADMIN CHECK [TABLE|INDEX]
ADMIN SHOW DDL [JOBS|QUERIES]
ADMIN SHOW TELEMETRY
ALTER DATABASE
ALTER INDEX
ALTER INSTANCE
ALTER PLACEMENT POLICY
ALTER TABLE
ALTER USER
ANALYZE TABLE
BACKUP
BEGIN
CHANGE COLUMN
CHANGE DRAINER
CHANGE PUMP
COMMIT
CREATE [GLOBAL|SESSION] BINDING
CREATE DATABASE
CREATE INDEX
CREATE PLACEMENT POLICY
CREATE ROLE
CREATE SEQUENCE
CREATE TABLE LIKE
CREATE TABLE
CREATE USER
CREATE VIEW
DEALLOCATE
DELETE
DESC
DESCRIBE
DO
DROP [GLOBAL|SESSION] BINDING
DROP COLUMN
DROP DATABASE
DROP INDEX
DROP PLACEMENT POLICY
DROP ROLE
DROP SEQUENCE
DROP STATS
DROP TABLE
DROP USER
DROP VIEW
EXECUTE
EXPLAIN ANALYZE
EXPLAIN
FLASHBACK TABLE
FLUSH PRIVILEGES
FLUSH STATUS
FLUSH TABLES
GRANT <privileges>
GRANT <role>
INSERT
KILL [TIDB]
LOAD DATA
LOAD STATS
MODIFY COLUMN
PREPARE
RECOVER TABLE
RENAME INDEX
RENAME TABLE
REPLACE
RESTORE
REVOKE <privileges>
REVOKE <role>
ROLLBACK
SELECT
SET DEFAULT ROLE
SET [NAMES|CHARACTER SET]
SET PASSWORD
SET ROLE
SET TRANSACTION
SET [GLOBAL|SESSION] <variable>
SHOW [BACKUPS|RESTORES]
SHOW ANALYZE STATUS
SHOW [GLOBAL|SESSION] BINDINGS
SHOW BUILTINS
SHOW CHARACTER SET
SHOW COLLATION
SHOW [FULL] COLUMNS FROM
SHOW CONFIG
SHOW CREATE PLACEMENT POLICY
SHOW CREATE SEQUENCE
SHOW CREATE TABLE
SHOW CREATE USER
SHOW DATABASES
SHOW DRAINER STATUS
SHOW ENGINES
SHOW ERRORS
SHOW [FULL] FIELDS FROM
SHOW GRANTS
SHOW INDEX [FROM|IN]
SHOW INDEXES [FROM|IN]
SHOW KEYS [FROM|IN]
SHOW MASTER STATUS
SHOW PLACEMENT
SHOW PLACEMENT FOR
SHOW PLACEMENT LABELS
SHOW PLUGINS
SHOW PRIVILEGES
SHOW [FULL] PROCESSSLIST
SHOW PROFILES
SHOW PUMP STATUS
SHOW SCHEMAS
SHOW STATS_HEALTHY
SHOW STATS_HISTOGRAMS
SHOW STATS_META
SHOW STATUS
SHOW TABLE NEXT_ROW_ID
SHOW TABLE REGIONS
SHOW TABLE STATUS
SHOW [FULL] TABLES
SHOW [GLOBAL|SESSION] VARIABLES
SHOW WARNINGS
SHUTDOWN
SPLIT REGION
START TRANSACTION
TABLE
TRACE
TRUNCATE
UPDATE
USE
WITH
- 数据类型
- 函数与操作符
- 聚簇索引
- 约束
- 生成列
- SQL 模式
- 表属性
- 事务
- 垃圾回收 (GC)
- 视图
- 分区表
- 临时表
- 缓存表
- 字符集和排序
- Placement Rules in SQL
- 系统表
mysql
- INFORMATION_SCHEMA
- Overview
ANALYZE_STATUS
CLIENT_ERRORS_SUMMARY_BY_HOST
CLIENT_ERRORS_SUMMARY_BY_USER
CLIENT_ERRORS_SUMMARY_GLOBAL
CHARACTER_SETS
CLUSTER_CONFIG
CLUSTER_HARDWARE
CLUSTER_INFO
CLUSTER_LOAD
CLUSTER_LOG
CLUSTER_SYSTEMINFO
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
DATA_LOCK_WAITS
DDL_JOBS
DEADLOCKS
ENGINES
INSPECTION_RESULT
INSPECTION_RULES
INSPECTION_SUMMARY
KEY_COLUMN_USAGE
METRICS_SUMMARY
METRICS_TABLES
PARTITIONS
PLACEMENT_POLICIES
PROCESSLIST
REFERENTIAL_CONSTRAINTS
SCHEMATA
SEQUENCES
SESSION_VARIABLES
SLOW_QUERY
STATISTICS
TABLES
TABLE_CONSTRAINTS
TABLE_STORAGE_STATS
TIDB_HOT_REGIONS
TIDB_HOT_REGIONS_HISTORY
TIDB_INDEXES
TIDB_SERVERS_INFO
TIDB_TRX
TIFLASH_REPLICA
TIKV_REGION_PEERS
TIKV_REGION_STATUS
TIKV_STORE_STATUS
USER_PRIVILEGES
VIEWS
METRICS_SCHEMA
- UI
- CLI
- 命令行参数
- 配置文件参数
- 系统变量
- 存储引擎
- 遥测
- 错误码
- 通过拓扑 label 进行副本调度
- 常见问题解答 (FAQ)
- 版本发布历史
- 术语表
基于角色的访问控制
TiDB 的基于角色的访问控制 (RBAC) 系统的实现类似于 MySQL 8.0 的 RBAC 系统。TiDB 兼容大部分 MySQL RBAC 系统的语法。
本文档主要介绍 TiDB 基于角色的访问控制相关操作及实现。
角色访问控制相关操作
角色是一系列权限的集合。用户可以创建角色、删除角色、将权限赋予角色;也可以将角色授予给其他用户,被授予的用户在启用角色后,可以得到角色所包含的权限。
创建角色
创建角色 app_developer,app_read 和 app_write:
CREATE ROLE 'app_developer', 'app_read', 'app_write';
角色名的格式和规范可以参考 TiDB 用户账户管理。
角色会被保存在 mysql.user
表中,角色名称的主机名部分(如果省略)默认为 '%'
。如果表中有同名角色或用户,角色会创建失败并报错。创建角色的用户需要拥有 CREATE ROLE
或 CREATE USER
权限。
授予角色权限
为角色授予权限和为用户授予权限操作相同,可参考 TiDB 权限管理。
为 app_read
角色授予数据库 app_db
的读权限:
GRANT SELECT ON app_db.* TO 'app_read'@'%';
为 app_write
角色授予数据库 app_db
的写权限:
GRANT INSERT, UPDATE, DELETE ON app_db.* TO 'app_write'@'%';
为 app_developer
角色授予 app_db
数据库的全部权限:
GRANT ALL ON app_db.* TO 'app_developer';
将角色授予给用户
假设有一个用户拥有开发者角色,可以对 app_db
的所有操作权限;另外有两个用户拥有 app_db
的只读权限;还有一个用户拥有 app_db
的读写权限。
首先用 CREATE USER
来创建用户。
CREATE USER 'dev1'@'localhost' IDENTIFIED BY 'dev1pass';
CREATE USER 'read_user1'@'localhost' IDENTIFIED BY 'read_user1pass';
CREATE USER 'read_user2'@'localhost' IDENTIFIED BY 'read_user2pass';
CREATE USER 'rw_user1'@'localhost' IDENTIFIED BY 'rw_user1pass';
然后使用 GRANT
授予用户对应的角色。
GRANT 'app_developer' TO 'dev1'@'localhost';
GRANT 'app_read' TO 'read_user1'@'localhost', 'read_user2'@'localhost';
GRANT 'app_read', 'app_write' TO 'rw_user1'@'localhost';
用户执行将角色授予给其他用户或者收回角色的命令,需要用户拥有 SUPER
权限。将角色授予给用户时并不会启用该角色,启用角色需要额外的操作。
以下操作可能会形成一个“关系环”:
CREATE USER 'u1', 'u2';
CREATE ROLE 'r1', 'r2';
GRANT 'u1' TO 'u1';
GRANT 'r1' TO 'r1';
GRANT 'r2' TO 'u2';
GRANT 'u2' TO 'r2';
TiDB 允许这种多层授权关系存在,可以使用多层授权关系实现权限继承。
查看角色拥有的权限
可以通过 SHOW GRANTS
语句查看用户被授予了哪些角色。当用户查看其他用户权限相关信息时,需要对 mysql
数据库拥有 SELECT
权限。
SHOW GRANTS FOR 'dev1'@'localhost';
+-------------------------------------------------+
| Grants for dev1@localhost |
+-------------------------------------------------+
| GRANT USAGE ON *.* TO `dev1`@`localhost` |
| GRANT `app_developer`@`%` TO `dev1`@`localhost` |
+-------------------------------------------------+
可以通过使用 SHOW GRANTS
的 USING
选项来查看角色对应的权限。
SHOW GRANTS FOR 'dev1'@'localhost' USING 'app_developer';
+----------------------------------------------------------+
| Grants for dev1@localhost |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `dev1`@`localhost` |
| GRANT ALL PRIVILEGES ON `app_db`.* TO `dev1`@`localhost` |
| GRANT `app_developer`@`%` TO `dev1`@`localhost` |
+----------------------------------------------------------+
SHOW GRANTS FOR 'rw_user1'@'localhost' USING 'app_read', 'app_write';
+------------------------------------------------------------------------------+
| Grants for rw_user1@localhost |
+------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `rw_user1`@`localhost` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `app_db`.* TO `rw_user1`@`localhost` |
| GRANT `app_read`@`%`,`app_write`@`%` TO `rw_user1`@`localhost` |
+------------------------------------------------------------------------------+
SHOW GRANTS FOR 'read_user1'@'localhost' USING 'app_read';
+--------------------------------------------------------+
| Grants for read_user1@localhost |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO `read_user1`@`localhost` |
| GRANT SELECT ON `app_db`.* TO `read_user1`@`localhost` |
| GRANT `app_read`@`%` TO `read_user1`@`localhost` |
+--------------------------------------------------------+
可以使用 SHOW GRANTS
或 SHOW GRANTS FOR CURRENT_USER()
查看当前用户的权限。这两个语句有细微的差异,SHOW GRANTS
会显示当前用户的启用角色的权限,而 SHOW GRANTS FOR CURRENT_USER()
则不会显示启用角色的权限。
设置默认启用角色
角色在授予给用户之后,并不会生效;只有在用户启用了某些角色之后,才可以使用角色拥有的权限。
可以对用户设置默认启用的角色;用户在登录时,默认启用的角色会被自动启用。
SET DEFAULT ROLE
{NONE | ALL | role [, role ] ...}
TO user [, user ]
比如将 app_read
和 app_wirte
设置为 rw_user1@localhost
的默认启用角色:
SET DEFAULT ROLE app_read, app_write TO 'rw_user1'@'localhost';
将 dev1@localhost
的所有角色,设为其默认启用角色:
SET DEFAULT ROLE ALL TO 'dev1'@'localhost';
关闭 dev1@localhost
的所有默认启用角色:
SET DEFAULT ROLE NONE TO 'dev1'@'localhost';
需要注意的是,设置为默认启用角色的角色必须已经授予给那个用户。
在当前 session 启用角色
除了使用 SET DEFAULT ROLE
启用角色外,TiDB 还提供让用户在当前 session 启用某些角色的功能。
SET ROLE {
DEFAULT
| NONE
| ALL
| ALL EXCEPT role [, role ] ...
| role [, role ] ...
}
例如,登录 rw_user1
后,为当前用户启用角色 app_read
和 app_write
,仅在当前 session 有效:
SET ROLE 'app_read', 'app_write';
启用当前用户的默认角色:
SET ROLE DEFAULT
启用授予给当前用户的所有角色:
SET ROLE ALL
不启用任何角色:
SET ROLE NONE
启用除 app_read
外的角色:
SET ROLE ALL EXCEPT 'app_read'
使用 SET ROLE
启用的角色只有在当前 session 才会有效。
查看当前启用角色
当前用户可以通过 CURRENT_ROLE()
函数查看当前用户启用了哪些角色。
例如,先对 rw_user1'@'localhost
设置默认角色:
SET DEFAULT ROLE ALL TO 'rw_user1'@'localhost';
用 rw_user1@localhost
登录后:
SELECT CURRENT_ROLE();
+--------------------------------+
| CURRENT_ROLE() |
+--------------------------------+
| `app_read`@`%`,`app_write`@`%` |
+--------------------------------+
SET ROLE 'app_read'; SELECT CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| `app_read`@`%` |
+----------------+
收回角色
解除角色 app_read
与用户 read_user1@localhost
、read_user2@localhost
的授权关系。
REVOKE 'app_read' FROM 'read_user1'@'localhost', 'read_user2'@'localhost';
解除角色 app_read
、app_write
与用户 rw_user1@localhost
的授权关系。
REVOKE 'app_read', 'app_write' FROM 'rw_user1'@'localhost';
解除角色授权具有原子性,如果在撤销授权操作中失败会回滚。
收回权限
REVOKE
语句与 GRANT
对应,可以使用 REVOKE
来撤销 app_write
的权限。
REVOKE INSERT, UPDATE, DELETE ON app_db.* FROM 'app_write';
具体可参考 TiDB 权限管理。
删除角色
删除角色 app_read
和 app_write
:
DROP ROLE 'app_read', 'app_write';
这个操作会清除角色在 mysql.user
表里面的记录项,并且清除在授权表里面的相关记录,解除和其相关的授权关系。执行删除角色的用户需要拥有 DROP ROLE
或 DROP USER
权限。
授权表
在原有的四张系统权限表的基础上,角色访问控制引入了两张新的系统表:
mysql.role_edges
:记录角色与用户的授权关系mysql.default_roles
:记录每个用户默认启用的角色
以下是 mysql.role_edges
所包含的数据。
select * from mysql.role_edges;
+-----------+-----------+---------+---------+-------------------+
| FROM_HOST | FROM_USER | TO_HOST | TO_USER | WITH_ADMIN_OPTION |
+-----------+-----------+---------+---------+-------------------+
| % | r_1 | % | u_1 | N |
+-----------+-----------+---------+---------+-------------------+
1 row in set (0.00 sec)
其中 FROM_HOST
和 FROM_USER
分别表示角色的主机名和用户名,TO_HOST
和 TO_USER
分别表示被授予角色的用户的主机名和用户名。
mysql.default_roles
中包含了每个用户默认启用了哪些角色。
select * from mysql.default_roles;
+------+------+-------------------+-------------------+
| HOST | USER | DEFAULT_ROLE_HOST | DEFAULT_ROLE_USER |
+------+------+-------------------+-------------------+
| % | u_1 | % | r_1 |
| % | u_1 | % | r_2 |
+------+------+-------------------+-------------------+
2 rows in set (0.00 sec)
HOST
和 USER
分别表示用户的主机名和用户名,DEFAULT_ROLE_HOST
和 DEFAULT_ROLE_USER
分别表示默认启用的角色的主机名和用户名。
其他
由于基于角色的访问控制模块和用户管理以及权限管理结合十分紧密,因此需要参考一些操作的细节: