加载中...

RBAC + 动态权限 + 用户分配权限


🧩 RBAC(基于角色)在这种场景下的问题:

RBAC 模型结构简单(User → Role → Permission),但缺点是:

  • 不支持用户直接拥有权限;
  • 不好表达“上下级授权”、“项目内的权限委托”;
  • 权限变化需要变更角色绑定,流程不灵活。

✅ 推荐方案:RBAC + ABAC 混合模型

🌟 RBAC(静态权限管理)

  • 用于处理大部分通用权限,比如「管理员」、「客服」这种固定权限;
  • 适合初始化赋权阶段。

🌟 ABAC(Attribute-Based Access Control)基于属性的权限控制

  • 权限是通过一系列“属性”来判断的,例如:

用户: {
  角色: "高级用户",
    部门: "销售部",
    项目ID: 1234
}

资源: {
  类型: "工单",
    所属项目ID: 1234
}

系统会判断:用户属性 + 环境 + 资源属性 => 是否有权限操作。

  • 适合动态、复杂场景
    • 比如「你只能修改你自己创建的项目」
    • 或「你是项目管理员,因此你可以给项目成员授权」
    • 权限逻辑可以存数据库或权限表达式配置中心

✅ 进阶:支持用户授权用户(Delegated Authorization)

这个就更细了,比如:

  • A 用户是管理员,可以把权限 P1 授权给 B;
  • B 拥有 P1 但不能授权他人(除非被赋予授权权限)。

📌 如何实现:

  • 数据库中记录“权限来源”:

user_id | permission_code | source_type | source_id
B         edit_user        delegated      A
  • 控制是否允许“传递性授权”(防止无限传递);
  • UI 上展示权限来源,便于追踪。

✅ 结合一下,一个健壮权限系统一般包含:

类型 说明
用户 → 角色 → 权限(RBAC) 通用权限、静态授权
用户 → 权限(单独授权) 特殊 case、动态调整
用户属性 + 资源属性 → 权限判断(ABAC) 条件判断、灵活表达
用户授权给用户(Delegated) 授权链、权限传递

✅ 最后说下技术实现建议:

  • 权限中心:统一控制权限逻辑,不分散在业务代码中;
  • 接口级鉴权:网关/服务端统一判断用户是否有权限;
  • 前端权限:菜单级、按钮级、字段级等用权限码控制;
  • 使用 DSL(领域特定语言)或权限表达式系统:让非开发人员也能配置权限逻辑。

权限系统常见是基于 RBAC 实现,但在用户权限需要动态变化、以及用户授权用户的场景下,单纯 RBAC 就不够用了。我更倾向使用“RBAC + ABAC + 授权链”的混合模型。

  • 静态角色用 RBAC 管理;
  • 用户动态权限通过直接赋权(User → Permission)或 ABAC 属性判断控制;
  • 授权链场景下可以记录权限来源,支持传递性控制。

这样系统既有灵活性,也可追踪权限变更来源,适合复杂中后台系统。


文章作者: LYF
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LYF !
评论
  目录