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:device001policyId 填这个值,设备才会套用这套权限。

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 写权限。
相关推荐
小蓝波2 小时前
docker 的命令
java·docker·容器
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第155题】【06_Spring篇】第15题:Spring 如何解决循环依赖问题?
java·spring·循环依赖·三级缓存·aop代理
ai生成式引擎优化技术2 小时前
从知识连接到智能组织:WSaiOS认知网络的理论框架与系统设计摘要
网络·python·plotly·django·pygame
lichenyang4532 小时前
从 0 新增一个 `has.echo`:我如何理解小程序容器里的 API 调用链路
前端
唐青枫2 小时前
Java Maven 实战指南:从 POM、依赖管理到多模块构建
java
硕风和炜2 小时前
【LeetCode: 1301. 最大得分的路径数目 + DP】
java·算法·leetcode·动态规划·dp·记忆化搜索
leptune2 小时前
Mac 使用 Microsoft Word 批量将 DOCX 转 PDF(保持原排版)
前端
大龄秃头程序员3 小时前
Flutter 长列表 1 万条滑动卡顿治理:Baseline vs Optimized 可跑 Demo
前端
SamDeepThinking3 小时前
面向对象真正管理的,不是对象,而是依赖
java·后端·程序员