概述
AOneID是天翼云AOne产品系列中的IDaaS(身份即服务,Identifier as a Service)创新成果,目标是打造一个强大且基于IDaaS理念的身份管理系统,
它能够无缝链接企业成员与应用程序,使得员工只需单一身份,就能安全高效地访问所有企业应用。在AOneId中,用户可以通过预配置的认证选项和
便捷的应用集成功能,轻松搭建自定义的用户管理体系。
作为标准的IDaaS解决方案,向应用程序提供权限管理是其核心功能之一。然而,由于可能需要针对客户的特定应用进行定制开发,这常常使人感到挑
战重重。本文意在揭示这一既神秘又强大的功能模块,逐步揭开它的面纱。
相关概念
在开始之前,我们先问一个问题:
什么是权限?
这个问题在不同的场景下,有很多种表述,如果你去问KIMI“权限的定义”时,会得到这样的回答:
权限(Permission)在不同的上下文中有着不同的定义,但通常它指的是在计算机科学、网络安全和组织管理中,对特定资源的访问和操作的授权
简单来讲,就是
是否禁止或允许某人对某种资源进行某种操作
经过技术化建模,我们可以得到一些技术概念。
效果
效果(Effect)指的是是否允许(Allow)或者禁止(Deny),如果是允许,则表明具备权限,如果是禁止,表明不具备权限。
动作和资源
所谓动作(Action)指的是上面所说的“某种操作”,资源(Resource)指的是上面所说的“某种资源”,之所以在这里并列提起,是因为动作和资源的分界
并非很严格,需要根据具体的场景来做规划。
案例1
例如,在API权限场景,我们可以把Http方法(Method)作为Action来编码,把接口路径作为资源来编码。假设我们现在有一个API接口,权限可以设计如下:
Action | Resource | 说明 |
---|---|---|
GET | /org/{orgId} | 获取指定机构的信息 |
PUT | /org/{orgId} | 全量更新指定机构的属性 |
DELETE | /org/{orgId} | 删除指定的机构 |
PATCH | /org/{orgId} | 更新指定机构的某个属性 |
案例2
例如,在工具栏场景,我们可以把接口路径来做为Action,把操作对象作为Resource,权限设计可以如下:
Action | Resource | 说明 |
---|---|---|
/org/get | {orgId} | 获取指定机构的信息 |
/org/update | {orgId} | 全量更新指定机构的属性 |
/org/delete | {orgId} | 删除指定的机构 |
/org/patch | {orgId} | 更新指定机构的某个属性 |
授权实体
授权实体(Entity)指的是上面所说“某人”及其扩展或分组。例如“某人”不一定是用户,也可以是应用,“某人”不一定是某个具体用户,而是一个群体(机构、用户组等)。
用户
用户是授权实体的一种,指的是具体的用户。
应用
应用是授权实体的一种,指的是平台上的应用,属于“某人”概念上的扩展。
用户组
用户组是授权实体的一种,指的是一组用户,属于“某人”概念的分组。
机构
机构是授权实体的一种,属于“某人”概念的分组。和用户组不同的是,机构是树形结构的分组,父机构的授权需要自动扩展到子机构。
权限策略
权限策略(Policy)定义了一些列的权限规则,这些规则为最终的权限校验提供了依据。每条策略都明确表达了一条规则:
是否禁止或允许某人对某种资源进行某种操作
在AoneID中,权限策略表达如下:
属性 | 说明 |
---|---|
entity_type | 授权实体类型,包括:角色(role),用户(user),用户组(team),机构(org) |
entity_id | 授权实体的ID,根据实体类型不同而表达不同含义,例如如果entity_type为user,则表示为用户id |
action_expr | 动作表达式,支持*通配符 |
resource_expr | 资源表达式,支持*通配符 |
eff_date | 生效时间 |
exp_date | 失效时间 |
effect | 效果 |
从上述的表达中,可以看出三点:
1、在策略中,并不需要枚举所有的动作和资源,而是可以使用通配符来匹配资源,例如/org/*可以代表所有以/org/为前缀的接口路径;
2、策略是有有效期的,可以进行临时授权;
3、可以直接指定授权对象进行直接授权,也可以通过角色(role)进行间接授权;
在实际的权限校验中,一次判断会匹配出多条策略,这些策略往往是相互冲突,相互覆盖的,这一点在后面进行讨论
角色
角色是权限策略的组合,一个角色可以包含多条策略,同时,也可以将角色授权给多个授权对象(用户,用户组,机构,应用等),这种授权可以称为间接授权。
间接授权在实操中更有效率,但没有直接授权灵活,两者可以搭配灵活使用。
令人遗憾的是,AOneID当前版本虽然模型上支持直接授权,但在界面上并不支持直接授权
权限空间
上面的概念只是RBAC的基本思想,对于所有人都不是很陌生。
RBAC(Role-Based Access Control,基于角色的访问控制)是一种广泛使用的访问控制策略,它通过角色来分配权限,而不是直接将权限分配给单个用户。
RBAC的核心思想是用户通过成为适当角色的成员来获得对资源的访问权限。这种模型简化了权限管理,提高了安全性,并使得权限分配更加灵活。
但是这些对于IDaaS来说,是否够了呢?
IDaaS一大核心功能是应用集成,对于IDaaS来说,应用集成中的身份认证(单点登录)只是基本诉求,它更希望的是为应用来提供权限服务,那么问题来了,应用A来了,
对它的动作和资源表达成方案A,应用B来了,对它的动作和资源表达成方案B,那么很容易造成代码和表达式上的冲突。
针对这个问题,AOneID引入了“权限空间”的概念,所谓权限空间,是一种用于管理和隔离权限资源的机制。权限分组允许开发者将资源、角色和权限授权统一组合在一起,
以适应复杂的组织架构和业务场景。
权限空间对动作、资源、策略、角色进行了隔离,应用A根据他自己的业务特点,规划了空间A,应用B根据自己的业务特点,规划了空间B,有效的避免了两者的冲突。