一、RBAC 模型:权限管理的基石

做量化平台,权限设计是躲不开的坎。我见过太多团队,一开始图省事,直接把权限写死在代码里。结果呢?业务一扩张,改权限比改策略还痛苦。

RBAC(Role-Based Access Control),说白了就是「用户 → 角色 → 权限」三层结构。用户不直接跟权限挂钩,而是通过角色来间接获得权限。这样做的好处很明显:你只需要管理角色,不用管每个用户具体能干啥。

1.1 核心三要素

要素 说明 量化场景举例
用户(User) 系统操作者 交易员、风控员、管理员
角色(Role) 权限的集合 策略编辑角色、订单审批角色
权限(Permission) 具体操作许可 查看订单、修改参数、执行交易

我个人习惯把权限拆成两个维度:功能权限数据权限。功能权限决定「能不能做」,数据权限决定「能做哪些数据」。这两个分开设计,后期维护会轻松很多。

1.2 为什么必须分离?

你想想看,两个交易员都有「查看订单」的功能权限。但一个只能看自己的订单,另一个能看全团队的订单。如果混在一起,你就得为每个用户单独配置数据范围,角色就失去了意义。

核心原则:功能权限控制「操作」,数据权限控制「范围」。两者正交,互不干扰。

二、细粒度权限控制:从粗放到精细

粗粒度权限就像一把大砍刀,要么全给,要么全不给。但在量化平台里,这远远不够。举个例子:你允许某个用户「编辑策略」,但你可能不希望他修改止损参数。这时候就需要细粒度控制。

2.1 资源级 vs 字段级

  • 资源级:控制能否访问某个模块(如策略管理、订单管理)
  • 字段级:控制能否修改某个字段(如止损价、杠杆倍数)
  • 操作级:控制增删改查的具体动作

我在项目中遇到过一个问题:风控员需要查看策略参数,但不能修改。如果只做资源级控制,他要么能改全部,要么什么都看不到。后来我们引入了字段级权限,把「止损价」「最大持仓」这些敏感字段单独拎出来,只读权限和编辑权限分开配置。

避坑指南:我曾经把字段级权限做得太细,每个字段都配一个权限点,结果角色配置页面密密麻麻全是复选框,运营同学直接崩溃。后来我改成「权限模板」模式,把常用组合预定义好,比如「只读模板」「风控模板」「管理员模板」,这样既灵活又易用。

三、数据权限与功能权限分离实战

这是本章的重头戏。很多系统把数据权限和功能权限混在一起,结果就是代码里到处都是 if-else 判断,维护成本极高。

3.1 功能权限设计

功能权限用「权限点」来表示。每个权限点对应一个具体的操作。

// 权限点定义示例
{
  "code": "strategy:edit",
  "name": "编辑策略",
  "group": "策略管理",
  "description": "允许修改策略参数"
}

// 角色与权限点关联
{
  "role": "策略分析师",
  "permissions": [
    "strategy:view",
    "strategy:edit",
    "strategy:clone"
  ]
}

嗯,这里要注意:权限点的命名最好用「模块:操作」的格式,这样一眼就能看出归属。我见过有人用数字编号,结果每次查权限都要翻文档,太痛苦了。

3.2 数据权限设计

数据权限更复杂一些。它通常涉及「数据范围」和「数据维度」两个概念。

数据范围 说明 适用场景
本人 只能看自己的数据 普通交易员
本部门 看部门内所有数据 部门主管
全部 看全平台数据 风控总监
自定义 按规则动态过滤 跨部门协作

数据维度则更细,比如按「策略类型」「交易对」「账户」来过滤。我习惯用表达式引擎来实现,这样不用改代码就能调整规则。

// 数据权限表达式示例
// 规则:只能查看 BTC 和 ETH 相关的策略
{
  "field": "symbol",
  "operator": "in",
  "value": ["BTCUSDT", "ETHUSDT"]
}

// 规则:只能查看自己创建的策略
{
  "field": "creator_id",
  "operator": "eq",
  "value": "{current_user_id}"
}
注意:数据权限表达式一定要做注入防护。我曾经见过有人通过构造特殊表达式,绕过了数据权限限制,查到了不该看的数据。后来我们加了白名单校验,只允许预定义的字段和操作符。

四、整体架构图

下面这张图是我自己总结的权限模型架构,你可以参考一下。

量化平台权限模型架构 用户层 角色层 功能权限 数据权限 增删改查 字段级控制 操作级控制 数据范围 数据维度 表达式引擎

这张图展示了三层架构:用户绑定角色,角色绑定权限。权限层又拆成功能权限和数据权限两个分支,各自有更细的控制粒度。这样做的好处是,当业务变化时,你只需要调整角色和权限的映射关系,用户层完全不用动。

五、避坑总结

做权限设计这几年,我踩过不少坑。挑几个典型的说说:

  • 权限膨胀:一开始设计得太细,权限点数量爆炸。后来我规定每个模块的权限点不超过 10 个,超过就要重新设计。
  • 缓存失效:用户权限变更后,缓存没及时更新,导致用户还在用旧权限。我后来加了版本号机制,每次变更都递增版本号,客户端发现版本号不一致就重新拉取。
  • 性能问题:数据权限表达式太复杂,每次查询都要解析,拖慢了接口响应。我后来把表达式编译成 SQL 片段,直接拼接到查询语句里,性能提升了一个数量级。
最后说一句:权限设计没有银弹。RBAC 模型虽然经典,但也要根据业务场景灵活调整。我的建议是,先做简单版本跑起来,等业务验证了再逐步精细化。别一开始就想做到完美,那样反而容易陷入过度设计的泥潭。

公众号:蓝海资料掘金营,微信deep3321