在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 对当前设备、权限自身、消息通道拥有全部读写权限,是本地开发调试用的全开放权限模板。
- 顶层字段释义
json
"policyId": "my-demo:device001"
- 策略唯一 ID,规范和 Thing 设备 ID 同名,一一绑定;
- 你的设备
my-demo:device001里policyId填这个值,设备才会套用这套权限。
json
"imports": {}
- 权限导入,空对象代表不复用其他策略;
- 复杂多角色场景可以填入其他 policyId,复用别人写好的权限规则。
json
"entries": { ... }
核心权限主体:所有角色、资源、授予权限全部写在 entries 内部,一个 entry 代表一组身份 + 权限规则。
- "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 写权限。