Skip to content

TiDB 角色管理

角色管理基本概念

角色定义

角色是一组权限的集合,用于简化用户权限的管理。通过将相同权限的用户分配到同一个角色,可以避免为每个用户单独授予权限,提高权限管理的效率和一致性。

角色的优势

  • 简化权限管理:通过角色批量管理用户权限,减少重复操作
  • 提高安全性:确保相同职责的用户拥有相同的权限,避免权限不一致
  • 便于审计:通过角色可以清晰地了解用户的权限范围
  • 灵活的权限控制:可以根据业务需求创建不同的角色,实现精细化的权限管理

角色与用户的关系

  • 一个用户可以拥有多个角色
  • 一个角色可以被多个用户拥有
  • 角色可以继承其他角色的权限

角色管理操作

创建角色

使用 CREATE ROLE 语句创建角色:

sql
CREATE ROLE [IF NOT EXISTS] role_name [, role_name] ...;

示例

sql
-- 创建单个角色
CREATE ROLE dev_role;

-- 同时创建多个角色
CREATE ROLE read_only_role, write_role;

查看角色

使用 SHOW ROLES 语句查看所有角色:

sql
SHOW ROLES;

查看指定用户拥有的角色:

sql
SHOW GRANTS FOR 'user'@'host';

查看角色拥有的权限:

sql
SHOW GRANTS FOR role_name;

修改角色

目前 TiDB 不支持直接修改角色名称,如需修改角色名称,可以通过以下步骤实现:

  1. 创建新角色
  2. 将原角色的权限复制到新角色
  3. 将用户从原角色迁移到新角色
  4. 删除原角色

删除角色

使用 DROP ROLE 语句删除角色:

sql
DROP ROLE [IF EXISTS] role_name [, role_name] ...;

示例

sql
-- 删除单个角色
DROP ROLE dev_role;

-- 同时删除多个角色
DROP ROLE read_only_role, write_role;

角色权限管理

授予角色权限

使用 GRANT 语句为角色授予权限:

sql
GRANT privileges ON database.table TO role_name;

示例

sql
-- 授予角色对指定数据库的所有权限
GRANT ALL PRIVILEGES ON test.* TO dev_role;

-- 授予角色对指定表的 SELECT 权限
GRANT SELECT ON test.users TO read_only_role;

-- 授予角色对所有数据库的 SELECT 权限
GRANT SELECT ON *.* TO read_only_role;

撤销角色权限

使用 REVOKE 语句撤销角色的权限:

sql
REVOKE privileges ON database.table FROM role_name;

示例

sql
-- 撤销角色对指定数据库的所有权限
REVOKE ALL PRIVILEGES ON test.* FROM dev_role;

-- 撤销角色对指定表的 SELECT 权限
REVOKE SELECT ON test.users FROM read_only_role;

角色权限类型

TiDB 支持的权限类型包括:

权限类型描述
ALL PRIVILEGES所有权限
ALTER修改表结构权限
ALTER ROUTINE修改存储过程和函数权限
CREATE创建数据库和表权限
CREATE ROUTINE创建存储过程和函数权限
CREATE TABLESPACE创建表空间权限
CREATE TEMPORARY TABLES创建临时表权限
CREATE USER创建用户权限
CREATE VIEW创建视图权限
DELETE删除数据权限
DROP删除数据库和表权限
EVENT事件调度器权限
EXECUTE执行存储过程和函数权限
FILE文件操作权限
GRANT OPTION授予权限给其他用户的权限
INDEX创建和删除索引权限
INSERT插入数据权限
LOCK TABLES锁表权限
PROCESS查看进程权限
REFERENCES外键权限
RELOAD重新加载配置权限
REPLICATION CLIENT复制客户端权限
REPLICATION SLAVE复制从库权限
SELECT查询数据权限
SHOW DATABASES查看数据库列表权限
SHOW VIEW查看视图定义权限
SHUTDOWN关闭服务器权限
SUPER超级用户权限
TRIGGER触发器权限
UPDATE更新数据权限
USAGE连接数据库权限

角色继承

角色继承概念

角色继承允许一个角色继承另一个角色的所有权限,实现权限的层级管理。通过角色继承,可以构建复杂的权限体系,提高权限管理的灵活性和可维护性。

授予角色给其他角色

使用 GRANT 语句将一个角色授予给另一个角色,实现角色继承:

sql
GRANT role_name [, role_name] ... TO target_role [, target_role] ... [WITH ADMIN OPTION];

示例

sql
-- 创建基础角色
CREATE ROLE base_role;
GRANT SELECT ON *.* TO base_role;

-- 创建开发角色,继承基础角色
CREATE ROLE dev_role;
GRANT base_role TO dev_role;
GRANT INSERT, UPDATE, DELETE ON test.* TO dev_role;

-- 创建管理员角色,继承开发角色
CREATE ROLE admin_role;
GRANT dev_role TO admin_role;
GRANT ALL PRIVILEGES ON *.* TO admin_role;

撤销角色继承

使用 REVOKE 语句撤销角色继承关系:

sql
REVOKE role_name [, role_name] ... FROM target_role [, target_role] ...;

示例

sql
REVOKE base_role FROM dev_role;

用户与角色的关联

授予角色给用户

使用 GRANT 语句将角色授予给用户:

sql
GRANT role_name [, role_name] ... TO 'user'@'host' [, 'user'@'host'] ... [WITH ADMIN OPTION];

示例

sql
-- 创建用户
CREATE USER 'dev_user'@'%' IDENTIFIED BY 'password';

-- 授予角色给用户
GRANT dev_role TO 'dev_user'@'%';

撤销用户的角色

使用 REVOKE 语句撤销用户的角色:

sql
REVOKE role_name [, role_name] ... FROM 'user'@'host' [, 'user'@'host'] ...;

示例

sql
REVOKE dev_role FROM 'dev_user'@'%';

设置用户默认角色

使用 SET DEFAULT ROLE 语句设置用户的默认角色,当用户登录时,会自动激活默认角色:

sql
SET DEFAULT ROLE role_name [, role_name] ... FOR 'user'@'host';
-- 或
SET DEFAULT ROLE ALL FOR 'user'@'host';

示例

sql
-- 设置单个默认角色
SET DEFAULT ROLE dev_role FOR 'dev_user'@'%';

-- 设置所有角色为默认角色
SET DEFAULT ROLE ALL FOR 'dev_user'@'%';

激活和停用角色

用户可以使用 SET ROLE 语句手动激活或停用角色:

sql
-- 激活指定角色
SET ROLE role_name [, role_name] ...;

-- 激活所有授予的角色
SET ROLE ALL;

-- 停用所有角色
SET ROLE NONE;

-- 激活默认角色
SET ROLE DEFAULT;

示例

sql
-- 激活开发角色
SET ROLE dev_role;

-- 激活所有角色
SET ROLE ALL;

-- 停用所有角色
SET ROLE NONE;

角色管理最佳实践

基于职责的角色设计

根据用户的职责和权限需求,设计不同的角色,实现精细化的权限管理:

角色类型权限范围适用场景
只读角色SELECT 权限数据分析、报表生成
读写角色SELECT、INSERT、UPDATE、DELETE 权限业务开发、日常操作
开发角色读写权限 + DDL 权限应用开发、测试
管理员角色所有权限数据库管理、系统维护

角色命名规范

使用清晰、具有描述性的角色名称,便于理解和管理:

[业务模块]-[权限级别]-[角色类型]

示例

  • order-read-only:订单模块只读角色
  • user-write:用户模块读写角色
  • admin-all:管理员角色

最小权限原则

遵循最小权限原则,只授予角色完成工作所需的最小权限,减少安全风险:

  • 对于只读用户,只授予 SELECT 权限
  • 对于业务用户,只授予相关业务表的权限
  • 避免滥用 ALL PRIVILEGES 和 SUPER 权限

定期审计角色权限

定期审计角色权限,确保权限配置符合业务需求和安全要求:

  • 定期检查角色的权限范围
  • 及时撤销不再需要的权限
  • 审查角色继承关系,避免权限蔓延

使用角色组管理复杂权限

对于复杂的权限体系,可以使用角色组的方式进行管理:

  1. 创建基础角色,定义通用权限
  2. 创建功能角色,继承基础角色并添加特定功能权限
  3. 创建业务角色,继承多个功能角色
  4. 将业务角色授予给用户

示例

-- 基础角色
CREATE ROLE base_read;
GRANT SELECT ON *.* TO base_read;

-- 功能角色
CREATE ROLE func_order;
GRANT INSERT, UPDATE, DELETE ON order.* TO func_order;

CREATE ROLE func_user;
GRANT INSERT, UPDATE, DELETE ON user.* TO func_user;

-- 业务角色
CREATE ROLE biz_sales;
GRANT base_read, func_order TO biz_sales;

CREATE ROLE biz_customer_service;
GRANT base_read, func_order, func_user TO biz_customer_service;

角色管理与其他功能的集成

与审计日志集成

TiDB 审计日志可以记录角色相关的操作,便于审计和追踪:

  • 角色的创建、删除操作
  • 角色权限的授予、撤销操作
  • 用户与角色的关联、撤销操作

与 TiDB Dashboard 集成

TiDB Dashboard 提供了角色管理的可视化界面,可以方便地进行角色的创建、修改、删除和权限管理。

与 TiDB 权限系统集成

角色管理是 TiDB 权限系统的重要组成部分,与用户权限管理紧密集成:

  • 角色权限与用户权限可以叠加
  • 角色权限可以被用户权限覆盖
  • 角色权限的修改会影响所有拥有该角色的用户

常见问题(FAQ)

Q1: TiDB 角色管理支持哪些版本?

A1: TiDB 从 v3.1.0 版本开始支持角色管理功能。建议使用 TiDB v4.0 及以上版本,以获得更完善的角色管理功能和更好的性能。

Q2: 如何查看用户当前激活的角色?

A2: 使用 SELECT CURRENT_ROLE() 函数查看用户当前激活的角色:

sql
SELECT CURRENT_ROLE();

Q3: 角色权限和用户直接权限有什么区别?

A3: 角色权限是一组权限的集合,可以被多个用户共享,便于批量管理;用户直接权限是直接授予给用户的权限,只适用于特定用户。当用户同时拥有角色权限和直接权限时,权限会叠加。

Q4: 如何实现角色的动态权限管理?

A4: 可以通过以下方式实现角色的动态权限管理:

  1. 结合 TiDB 的权限系统和业务逻辑,实现基于角色的访问控制
  2. 使用存储过程或触发器,根据业务规则动态调整角色权限
  3. 结合外部认证系统,实现角色的动态同步和管理

Q5: 角色继承的最大层级是多少?

A5: TiDB 目前对角色继承的层级没有明确限制,但建议不要设计过深的角色继承关系,以免增加权限管理的复杂度和性能开销。一般建议角色继承层级不超过 3 层。

Q6: 如何备份和恢复角色配置?

A6: 可以使用以下方式备份和恢复角色配置:

  1. 使用 mysqldump 工具备份包含角色信息的系统表
  2. 使用 SHOW CREATE ROLESHOW GRANTS 语句导出角色和权限配置
  3. 在恢复时,使用导出的语句重新创建角色和权限配置

Q7: 角色管理会影响数据库性能吗?

A7: 角色管理对数据库性能的影响很小,主要体现在:

  • 用户登录时加载角色权限
  • SQL 执行时检查角色权限
  • 角色权限变更时的权限缓存更新

在正常使用情况下,角色管理不会对数据库性能造成明显影响。

Q8: 如何撤销角色的所有权限?

A8: 可以使用以下步骤撤销角色的所有权限:

  1. 查看角色拥有的所有权限
  2. 逐一撤销角色的权限
  3. 撤销角色继承的其他角色

或者使用 REVOKE ALL PRIVILEGES 语句撤销角色的所有直接权限,然后撤销角色继承:

sql
REVOKE ALL PRIVILEGES ON *.* FROM role_name;
REVOKE ALL ROLES FROM role_name;