角色有员工、主管、HR、CEO 等
每个人可看到自己的 kpi 数据
组织架构中,主管可看到同一级以及下级所有人的 kpi 数据
HR 可看到自己所负责部门以及下级所有人的 kpi 数据
用 casbin 模型实现上述权限需求。
需求分析
这是一个典型的基于角色(RBAC)和层级关系的权限控制系统
需要考虑以下几个关键点:
角色继承关系
组织架构的层级关系
数据访问权限的规则
实现方案
让我们使用 Casbin 的 RBAC 模型来实现,主要包含以下部分:
角色定义
权限规则
层级关系
rbac_model.conf
请求定义
[request_definition]
r = sub, obj, act
策略定义
[policy_definition]
p = sub, obj, act
角色定义
[role_definition]
g = _, _ # 用户-角色关系
g2 = _, _ # 组织架构层级关系
策略效果
[policy_effect]
e = some(where (p.eft == allow))
匹配器
[matchers]
m = g(r.sub, p.sub) &&
(r.obj == p.obj ||
(g2(r.obj, p.obj) && g(r.sub, "supervisor")) ||
(g2(r.obj, p.obj) && g(r.sub, "hr") && checkDepartment(r.sub, r.obj))) &&
r.act == p.act
rbac_policy.csv
角色权限定义
p, employee, self, read
p, supervisor, subordinate, read
p, hr, department, read
p, ceo, all, read
用户-角色映射
g, alice, employee
g, bob, supervisor
g, carol, hr
g, david, ceo
组织架构层级关系
g2, emp001, self
g2, emp002, subordinate
g2, dept001, department
g2, company, all
实现说明
- 模型设计解释 1:
- 使用了两个 RBAC 系统:
-
g
: 用于定义用户和角色的关系 -
g2
: 用于定义组织架构的层级关系
-
- 匹配器(matcher)说明:
-
g(r.sub, p.sub)
: 检查用户是否具有相应角色 -
r.obj == p.obj
: 检查是否是访问自己的数据 -
g2(r.obj, p.obj) && g(r.sub, "supervisor")
: 检查主管访问下级数据的权限 -
g2(r.obj, p.obj) && g(r.sub, "hr") && checkDepartment(r.sub, r.obj)
: 检查 HR 访问部门数据的权限
- 权限规则说明:
- 员工只能查看自己的 KPI 数据
- 主管可以查看下级的 KPI 数据
- HR 可以查看其负责部门的 KPI 数据
- CEO 可以查看所有人的 KPI 数据