一、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 片段,直接拼接到查询语句里,性能提升了一个数量级。
公众号:蓝海资料掘金营,微信deep3321