常识:用户分配权限

1、RBAC

RBAC(Role-Based Access Control)是基于角色的访问控制,用户绑定角色,角色关联功能,用户只有权访问自己角色所关联的功能。

在这里插入图片描述
RBAC 模型结构简单(User → Role → Permission),但缺点是:

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

2、ABAC

ABAC基于属性的访问控制(Attribute-Based Access Control,简称 ABAC),它的原理是通过属性组合动态判断一个操作是否可以被允许。

考虑ABAC的模型时,我们需要一个更加复杂的场景:OA系统中的文档系统(下面例子灵感来源于Authing官网)。

  • 授权员工张三有《xxx公告》的编辑权限;
  • 当《xxx公告》的所属部门跟李四的部门相同时,李四可以访问这个文档;
  • 当王五是《xxx公告》的拥有者并且《xxx公告》的状态是草稿时,王五可以编辑这个文档;
  • 早上九点前禁止 A 部门的人访问《xxx公告》;
  • 在除了上海以外的地方禁止以管理员身份访问 A 系统。

从上面这个例子中,我们可以看到ABAC模型与RBAC模型的区别:RBAC是静态的,用户具备的权限只与关联角色相关,不随自身特征变化而改变;ABAC是动态的,时移世易,随着用户特征值的变化,权限也随之变化。如果将角色看做一种特征值,那RBAC就是一维的ABAC。
在这里插入图片描述
在 ABAC 模型中,一个操作是否被允许是基于对象、资源、操作和环境信息共同动态计算决定的:

  • 对象是当前请求访问资源的用户,用户的属性包括ID、员工性质(正式、实习、外包等)、员工类型(普通、销售、一线等)、岗位角色、所在部门、办公地点、组织成员身份等;
  • 资源是当前用户要访问的资产或对象,例如文件、数据、服务器、API等;
  • 操作是用户试图对资源进行的操作,常见的操作包括查询、编辑(新增、修改)、复制、删除、导出等;
  • 环境是每个访问请求的上下文,环境属性包含访问的时间、位置,对象的设备,通信协议和加密强度等。

在 ABAC模型 的决策语句的执行过程中,决策引擎会根据定义好的决策语句,结合对象、资源、操作、环境等因素动态计算出决策结果。每当发生访问请求时,ABAC模型决策系统都会分析属性值是否与已建立的策略匹配。如果有匹配的策略,访问请求就会被通过。

3、RBAC与ABAC对比

3.1 实现方式

RBAC实现方式相对较简单,主要需要考虑以下几个方面:

  • 角色定义:定义不同的角色,根据不同的职责和权限进行划分。
  • 角色分配:将用户分配到相应的角色中。
  • 权限分配:将不同的权限分配给不同的角色,以实现权限控制。

ABAC的实现过程相对复杂,需要考虑以下几个方面:

  • 属性设计:设计适当的属性标识用户、资源、环境等。
  • 访问策略:基于属性来制定访问策略。
  • 实现机制:引入多个组件来实现属性访问控制,如规则引擎等。

3.2 适用场景

RBAC:
适用于规模较小、角色划分较为静态的场景,比如一些中小型企业、少量管理员对应着少量功能的系统等,它的优点在于结构清晰,易于管理。但是如果角色不够细分,就不能对不同的用户进行详细的权限控制,也不太适用于复杂多层次的业务场景。

ABAC:
适用于复杂多层次、动态变化的场景,它的优点在于非常灵活,可以应对不同的用户、不同的业务需求,更加符合实际场景的需求。但是ABAC需要对各种属性进行建模,实现更加复杂,需要的技术支持和投入也更大。

4、支持用户授权用户(Delegated Authorization)

这个就更细了,比如:

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

如何实现:

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

5、总结

最后说下技术实现建议:

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳与星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值