Eclipse Ditto 的权限策略

在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 代表一组身份 + 权限规则。

  1. "DEFAULT" 权限分组(entries 下的 key)

json

复制代码
"DEFAULT": {
  "subjects": { ... }, // 访问人/客户端身份
  "resources": { ... }, // 能操作哪些资源
  "importable": "implicit"
}
  • DEFAULT:分组名称,自定义命名,这里默认分组;
  • importable: "implicit":允许其他 Policy 自动导入复用这条权限规则。

2.1 subjects:访问身份(谁能访问设备)

json

复制代码
"subjects": {
  "nginx:ditto": {
    "type": "generated"
  }
}
  1. nginx:ditto:身份标识(基础账号格式 用户名:密码) 就是你浏览器、前端 TS 代码、curl 请求登录 Ditto 用的账号密码:账号 ditto,密码 ditto。
  2. "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:

  1. ✅ 读取设备静态信息(型号、车间)、实时负压温度;
  2. ✅ 修改传感器压力数值、下发阀门 / 风机控制指令;
  3. ✅ 订阅 WebSocket 实时事件,Three.js 自动刷新 3D 模型数据;
  4. ✅ 在 Ditto Explorer 里编辑、修改这条 Policy 权限本身;
  5. ✅ 使用 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"]} // 只能收事件,不能下发指令
}

五、关键概念速记

  1. subjects = 谁来访问(账号 / 客户端)
  2. resources = 能操作什么(设备数据 / 权限 / 消息)
  3. grant = 允许做什么(READ 读 / WRITE 写)
  4. policyId 和 Thing 的 policyId 绑定,决定设备用哪套访问规则
  5. 本地调试全开放权限(你当前这份)适合学习;工厂生产环境必须拆分只读 / 操作账号,收紧 WRITE 写权限。
相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端