MySQL高级讲座篇之:MySQL 8.0的`Role-Based Access Control` (`RBAC`) 实践与设计。

咳咳,麦克风试音,喂喂喂,大家好,我是老司机,今天咱们来聊聊MySQL 8.0的RBAC,也就是基于角色的访问控制。这玩意儿听起来高大上,其实理解起来也挺简单,用好了能让你的数据库权限管理瞬间起飞。

咱们先来个热身,想象一下,你是公司DBA,手底下管着一大堆数据库,每个数据库里又有一堆表,每个表里还有各种数据。现在来了个需求:

  • 销售部门的张三,需要能查询所有客户信息,但不能修改。
  • 运营部门的李四,需要能修改部分产品信息,但不能删除。
  • 财务部门的王五,需要能查询订单信息和用户支付信息,但不能修改用户密码。

如果你还是用老办法,一个个GRANT权限给用户,那估计你头发都要掉光。而且,将来人员变动,权限调整,那简直就是噩梦。

所以,RBAC就来拯救你了。

啥是RBAC?

简单来说,RBAC就是把权限授予角色,然后把角色授予用户。这样,用户就拥有了角色的所有权限。

  • 角色(Role): 一组权限的集合,例如 "销售经理"、"运营主管"、"财务主管" 等。
  • 权限(Privilege): 数据库操作的许可,例如 SELECT、INSERT、UPDATE、DELETE 等。
  • 用户(User): 数据库用户。

RBAC的优点?

  • 简化权限管理: 不需要为每个用户单独授予权限,只需要管理角色即可。
  • 提高安全性: 权限集中管理,减少误操作和权限泄露的风险。
  • 方便维护: 人员变动,只需要调整用户的角色即可,无需修改大量的权限配置。

MySQL 8.0的RBAC实现

MySQL 8.0 原生支持 RBAC,提供了一套完整的角色管理命令:

  • CREATE ROLE: 创建角色。
  • DROP ROLE: 删除角色。
  • GRANT <privileges> TO ROLE <role_name>: 授予角色权限。
  • REVOKE <privileges> FROM ROLE <role_name>: 从角色撤销权限。
  • GRANT ROLE <role_name> TO <user_name>: 授予用户角色。
  • REVOKE ROLE <role_name> FROM <user_name>: 从用户撤销角色。
  • SET DEFAULT ROLE: 设置用户的默认角色。
  • SET ROLE: 激活角色。

实战演练

咱们来一步步实现前面提到的需求:

1. 创建角色

CREATE ROLE 'sales_manager'@'%';
CREATE ROLE 'operation_director'@'%';
CREATE ROLE 'finance_director'@'%';

这里创建了三个角色,sales_manageroperation_directorfinance_director'@'%' 表示允许从任何主机连接的用户使用该角色。你也可以指定特定的主机,例如 '@'localhost'

2. 授予角色权限

GRANT SELECT ON `your_database`.`customers` TO 'sales_manager'@'%';

GRANT SELECT, UPDATE ON `your_database`.`products` TO 'operation_director'@'%';

GRANT SELECT ON `your_database`.`orders` TO 'finance_director'@'%';
GRANT SELECT ON `your_database`.`user_payments` TO 'finance_director'@'%';

-- 为了安全,千万不要直接授予用户修改密码的权限,而是应该通过存储过程等方式控制。
-- 这里只是演示,实际生产环境请务必注意安全!
-- GRANT UPDATE (password) ON `your_database`.`users` TO 'finance_director'@'%';

这里授予了各个角色相应的权限。注意,权限的粒度可以细化到表级别、列级别,甚至存储过程级别。 实际生产环境,要根据最小权限原则,只授予必要的权限。

3. 创建用户

CREATE USER 'zhangsan'@'%' IDENTIFIED BY 'your_password';
CREATE USER 'lisi'@'%' IDENTIFIED BY 'your_password';
CREATE USER 'wangwu'@'%' IDENTIFIED BY 'your_password';

创建三个用户,zhangsanlisiwangwuIDENTIFIED BY 'your_password' 用于设置用户的密码。实际生产环境,建议使用更安全的密码策略。

4. 授予用户角色

GRANT 'sales_manager'@'%' TO 'zhangsan'@'%';
GRANT 'operation_director'@'%' TO 'lisi'@'%';
GRANT 'finance_director'@'%' TO 'wangwu'@'%';

将角色授予用户。现在,zhangsan 就拥有了 sales_manager 角色的所有权限,可以查询客户信息了。

5. 激活角色

用户登录数据库后,需要激活角色才能使用角色的权限。

-- 以 zhangsan 用户登录数据库
mysql -u zhangsan -p

-- 激活角色
SET ROLE 'sales_manager'@'%';

-- 现在 zhangsan 可以查询客户信息了
SELECT * FROM `your_database`.`customers`;

可以通过 SET ROLE ALL 激活所有授予用户的角色。 如果要禁用所有角色,可以使用 SET ROLE NONE

6. 设置默认角色

可以为用户设置默认角色,这样用户登录数据库后会自动激活该角色。

GRANT 'sales_manager'@'%' TO 'zhangsan'@'%';
SET DEFAULT ROLE 'sales_manager'@'%' FOR 'zhangsan'@'%';

现在,zhangsan 登录数据库后,会自动激活 sales_manager 角色。

RBAC进阶用法

  • 多重角色: 一个用户可以拥有多个角色。例如,一个用户既是销售经理,又是运营主管。
  • 继承角色: 可以创建一个父角色,然后让其他角色继承父角色的权限。例如,可以创建一个 "只读角色",然后让所有需要只读权限的角色都继承它。
  • 动态权限: 可以使用存储过程和函数来动态控制权限。例如,可以根据用户的部门和职位来授予不同的权限。

RBAC设计原则

  • 最小权限原则: 只授予用户必要的权限。
  • 职责分离原则: 避免将过多的权限授予一个角色。
  • 权限集中管理原则: 将权限集中管理,方便维护和审计。
  • 审计原则: 记录所有权限的变更操作,方便审计和追溯。

RBAC设计案例

咱们来设计一个更复杂的RBAC系统,假设我们有一个电商平台,需要管理用户、商品、订单、支付等数据。

| 角色名称 | 描述 | 权限 * catalog_manager:负责商品目录的管理,包括商品分类、商品属性等。

  • order_manager:负责订单的管理,包括订单创建、订单修改、订单状态更新等。
  • payment_processor:负责支付处理,包括支付请求、支付回调、退款等。
  • user_manager:负责用户管理,包括用户注册、用户登录、用户资料修改等。
  • administrator:拥有所有权限,可以管理所有数据。

角色权限

| 角色名称 | 表格权限

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注