在Eclipse Ditto中有专门管理物模型读取和写入的Policies。
完整权限管理的数据如下:
{ "policyId": "my-demo:device001", "imports": {}, "entries": { "DEFAULT": { "subjects": { "nginx:ditto": { "type": "generated" } }, "resources": { "thing:/": { "grant": [ "READ", "WRITE" ], "revoke": [] }, "policy:/": { "grant": [ "READ", "WRITE" ], "revoke": [] }, "message:/": { "grant": [ "READ", "WRITE" ], "revoke": [] } }, "importable": "implicit" } } }一、整体解释
这份policyId: "my-demo:device001"是数字孪生设备权限控制规则: 允许身份nginx:ditto对当前设备、权限自身、消息通道拥有全部读写权限,是本地开发调试用的全开放权限模板。
1. 顶层字段释义
json
"policyId": "my-demo:device001"- 策略唯一 ID,规范和 Thing 设备 ID 同名,一一绑定;
- 你的设备
my-demo:device001里policyId填这个值,设备才会套用这套权限。
json
"imports": {}- 权限导入,空对象代表不复用其他策略;
- 复杂多角色场景可以填入其他 policyId,复用别人写好的权限规则。
json
"entries": { ... }核心权限主体:所有角色、资源、授予权限全部写在 entries 内部,一个 entry 代表一组身份 + 权限规则。
2. "DEFAULT" 权限分组(entries 下的 key)
json
"DEFAULT": { "subjects": { ... }, // 访问人/客户端身份 "resources": { ... }, // 能操作哪些资源 "importable": "implicit" }DEFAULT:分组名称,自定义命名,这里默认分组;importable: "implicit":允许其他 Policy 自动导入复用这条权限规则。
2.1 subjects:访问身份(谁能访问设备)
json
"subjects": { "nginx:ditto": { "type": "generated" } }nginx:ditto:身份标识(基础账号格式用户名:密码) 就是你浏览器、前端 TS 代码、curl 请求登录 Ditto 用的账号密码:账号 ditto,密码 ditto。"type": "generated":内置自动生成的基础鉴权账号类型,本地 Docker 环境默认自带。
作用:只有使用
ditto/ditto账号发起的请求,才会匹配下面 resources 里的读写权限。
2.2 resources:资源路径 + 授予 / 回收权限(核心管控)
resources 里每一条,代表一类可访问资源,grant允许权限,revoke禁止权限(这里全为空,无禁止项)
①thing:/数字孪生设备本体资源
json
"thing:/": { "grant": ["READ", "WRITE"], "revoke": [] }thing:/代表整台 my-demo:device001 设备全部内容:attributes 静态档案、features 传感器 / 执行器数据;READ:允许读取设备所有数据;WRITE:允许修改压力、温度、阀门状态、新增属性等所有写操作;- 效果:前端可以读料仓负压,也能下发指令开关风机阀门。
②policy:/权限策略本身资源
json
"policy:/": { "grant": ["READ", "WRITE"], "revoke": [] }policy:/代表这份权限配置自己;- 读写权限:允许查看、编辑、删除当前这条 Policy 规则;
- 如果你去掉
WRITE,就只能看权限,不能修改权限配置。
③message:/消息通道资源
json
"message:/": { "grant": ["READ", "WRITE"], "revoke": [] }- 管控设备上下行消息、WebSocket 事件流、MQTT 指令收发;
READ:允许订阅 WS 实时事件(你的 Vue+Three.js 前端接收料仓压力变更全靠这个权限);WRITE:允许下发控制指令、手动发送模拟消息(Ditto Explorer 里 Send Message 功能依赖这个权限)。
2.3 revoke 字段
所有"revoke": []为空数组 =没有任何权限被禁止; 如果需要精细化限制,比如禁止写执行器,可以在这里加入权限做回收。
三、整套权限的实际业务效果(对应你的料仓项目)
前端使用账号ditto/ditto访问 Ditto:
- ✅ 读取设备静态信息(型号、车间)、实时负压温度;
- ✅ 修改传感器压力数值、下发阀门 / 风机控制指令;
- ✅ 订阅 WebSocket 实时事件,Three.js 自动刷新 3D 模型数据;
- ✅ 在 Ditto Explorer 里编辑、修改这条 Policy 权限本身;
- ✅ 使用 Send Message 模拟设备上报、下发控制报文;
四、拓展:精细化权限改造示例(生产环境不能全开放)
比如车间操作员只能看传感器数据,不能操作阀门,修改 resources:
json
"resources": { "thing:/features/sensor": {"grant":["READ"],"revoke":[]}, // 仅允许读压力温度 "thing:/features/actuator": {"grant":[],"revoke":["WRITE"]}, // 禁止写执行器(不能开关阀门) "thing:/attributes": {"grant":["READ"],"revoke":[]}, "message:/": {"grant":["READ"],"revoke":["WRITE"]} // 只能收事件,不能下发指令 }五、关键概念速记
- subjects= 谁来访问(账号 / 客户端)
- resources= 能操作什么(设备数据 / 权限 / 消息)
- grant= 允许做什么(READ 读 / WRITE 写)
- policyId 和 Thing 的 policyId 绑定,决定设备用哪套访问规则
- 本地调试全开放权限(你当前这份)适合学习;工厂生产环境必须拆分只读 / 操作账号,收紧 WRITE 写权限。