首页平台权限模型
Permissions

权限由平台执行,不用每个系统各写一遍。

应用声明自己有哪些对象、操作和权限点;平台按部门、角色、数据范围和字段规则统一判定;组织在自己的角色里决定谁能做什么。同一条记录,不同的人看到不同的那一份,助手也一样。

一条记录 张伟 · 西湖店会员 手机138 0013 8000 课程包康复 10 次 · 剩 2 次 病历摘要腰椎术后康复… 累计消费¥ 12,800 前台 手机138 **** 8000 课程包剩 2 次 病历摘要隐藏 负责康复师 手机138 **** 8000 病历摘要腰椎术后康复… 累计消费隐藏 店长 手机138 0013 8000 累计消费¥ 12,800病历摘要 隐藏 问助手 张伟的病历摘要是什么? 回答 · 读取了 会员 当前角色看不到病历摘要。 助手以成员本人的身份读数据,得到的也是本人能看的那一份
Declare, enforce, customize

权限分三步:应用声明,平台执行,组织定制。

应用不实现权限判定。对象引擎、平台的数据接口和应用 SDK 在同一处判定,判定的输入是成员、部门、角色、资源、动作和数据属性。

01

应用声明

清单里写对象(entities)、操作(ops)和权限点(permissions),随版本审核。

应用不建自己的授权表。

02

平台执行

部门、角色、权限点、数据范围、字段规则由平台判定。

数据范围在 SQL 里过滤,范围外的记录回答「不存在」(404)。

03

组织定制

管理员在「权限 → 业务角色」里定义角色,分配权限点、数据范围和字段规则,再开启「精细权限」。

manifest.json(节选)
{
  "protocol": "k3/1", "id": "crm", "version": "1.2.0", "level": 3, "name": "客户",
  "nav":      [{ "label": "客户", "route": "/customers" }],                 // Agent 只能链接到这里声明的页面
  "entities": [{ "type": "customer", "route": "/customers/{id}", "listRoute": "/customers",
                 "filterable": { "stage": ["lead","won"] },                  // app_read 能按这些字段筛
                 "context": { "redact": ["phone"] } }],                      // 对 Agent 读取打码的字段
  …
  "opsApi": "/k3", "dryRun": "full",
  "permissions": [{ "id": "crm.write", "label": "编辑客户" }],
  …
}
对象、打码字段与权限点都写在清单里开发文档 →
Scope & fields

数据范围细到部门,字段可以遮盖或隐藏。

  • 五种数据范围

    本人、本部门、本部门及下级、全部、指定部门。总数、分页和游标都遵守范围。

  • 字段规则

    字段可以遮盖,也可以整个隐藏。受限字段不能写,也不能当筛选或排序条件,避免反推。

  • 多个角色叠加

    范围取并集;字段只有在每个可读角色都限制时才受限,取较轻的一种。

  • 导出也是一次读取

    只带范围内的行,遮盖的字段保持遮盖,隐藏的字段连列名都没有。

  • 管理员与审计员

    开启精细权限后,成员只看到角色授予的数据;管理员不会被锁在外面,审计员只读全部。

  • 助手是成员权限的子集

    助手以成员本人的范围读取,字段规则同样生效;它只读和起草,什么都不直接写。

Runtime checks

应用在运行时向平台问权限,一次最多 100 个权限点。

应用自己的页面和服务也要知道「这个人能不能做」。答案来自平台,与组织的角色设置一致。

  • 单个判定。GET /app/v1/access 回答调用者在本应用一个权限点上的结果与数据范围。
  • 批量判定。POST /app/v1/access/points 一次问 1 到 100 个权限点,答案与逐个调用相同,不缓存。
  • SDK 里现成。Go SDK 的 AccessMany 与 Authz.CheckMany。
  • 找人也按范围。GET /app/v1/org/members 只列出调用者数据范围内的成员,不含联系方式。
谁在问得到什么
应用自己的令牌清单 uses 里写的范围,在每个安装了它的组织里自带
页面会话里的成员这位成员在本应用权限点上的范围
缺少范围HTTP 403,错误码 scope_required
Resource access

共享、继承和到期由平台的访问内核保管。

图表、看板、文件夹、敏感记录这类「单个资源给谁看」的名单,应用在清单的 resources 里声明类型,名单只在平台的访问内核里改。

应用不自己做分享界面或访问控制表,门禁会检查。

  • 查看、评论、编辑、管理。取最大,没有拒绝项;授权不超过授权人自己的级别;所有者恰好一个,可以转让。
  • 树形资源继承,授权可以限时。文件夹下的节点继承上级名单,可以停止或恢复继承;限时授权到期即不生效。
  • 访问申请由决定人审批。成员可以申请访问,决定人批准或拒绝。名单变化后,平台向资源所属的应用发 access.changed。
分享「门店看板」
谁能访问
  • 周明(你)所有者
  • 华东区(含下级)可查看来自「区域报表」
  • 陈静可编辑到 11 月 30 日
通用访问
仅受邀的人
只有上面名单里的人能打开 完成
示意

平台提供统一的分享对话框;助手对资源只读,范围外的资源一律 404,不泄露是否存在。接口说明

Three layers

开发者看不到组织的数据。

组织、开发者、平台三层的数据互相隔离。应用的代码运行时会处理组织的数据,所以平台把它当作不可信的第三方:

  • 数据只经平台接口;
  • 凭据短期有效;
  • 出网默认拒绝。
组织层 业务数据归组织 会员、订单、合同、知识库 成员、部门、角色、数据范围 审计链(只追加) 应用配置与品牌 行级安全在数据库里强制 看不到 开发者层 应用本身,不含任何组织数据 代码、版本、manifest 模板、知识包、市场资料 聚合指标、脱敏错误 收款与结算 代码被当作不可信第三方运行 平台层 运营,默认没有权限 账户、计费、许可证 市场目录、审核 平台遥测、全局配置 看不到任何组织的业务数据 技术支持进入:组织批准、限时、只读、全程记录、随时撤销(break-glass)
层里面有什么谁能看
组织业务数据、成员、组织架构、角色、安装配置、审计组织自己;平台只在组织批准时限时、只读进入
开发者应用代码、版本、清单、模板、市场资料、收款与分账开发者;平台审核人员
平台账户与计费、许可证、市场目录、运行遥测平台运营,按角色

开发者没有生产环境 shell、没有数据库凭据,看不到原始日志与请求内容;拿到的只有应用级指标和脱敏错误。安全与信任

用组织真实的部门和角色看一遍权限。

约一次演示,按组织的部门树和角色配一遍:同一条记录,前台、康复师、店长和助手各看到什么。