学习记录
RODMENA LRS
即将推出学习证据存储:发生了什么,只记录一次,原样保存。
RODMENA LRS 是一个学习记录存储(Learning Record Store):它以 xAPI 格式接收学习活动记录,原样存储,并通过标准 xAPI 查询接口返回。它通过了 ADL LRS Conformance Test Suite 中针对 xAPI 1.0.3 和 xAPI 2.0 的每一项测试。每个客户的记录在数据库内部即与其他所有客户的记录隔离。记录内容静态加密,学习者标识符仅以带密钥的假名形式存储。已存储的记录无法更改;学习者的个人数据可应请求擦除,每次擦除都会写入可检测篡改的日志。
适用对象。 需要符合规范的位置来保存学习者活动记录的学习平台和培训机构。它是一项后端服务:产品构建在其之上,并从其服务器调用它。学习者和浏览器不直接与其通信。REES 是它的第一个使用方。
- 状态
- 即将推出
- 所属部分
- 产品与服务
- 许可
- 专有。版权所有 RODMENA LIMITED,保留所有权利。
- 一致性
- 1,365 xAPI 1.0.3 一致性测试,全部通过
- 1,435 xAPI 2.0 一致性测试,全部通过
- 验证于 2026年9月23日
- 标签
- xAPI学习记录一致性多租户数据保护审计跟踪
技术规格
面向技术评估人员陈述。没有测量值的行不予列出。
标准
- xAPI 1.0.3
- ADL Experience API Specification,版本 1.0.3
- xAPI 2.0
- IEEE 9274.1.1-2023
- 版本选择
- 按请求,通过 X-Experience-API-Version 标头。接受 1.0.x 和 2.0.x;缺失或未知版本将以 400 拒绝。
- 一致性测试套件
- ADL LRS Conformance Test Suite,最近一次运行于 2026 年 9 月 23 日
- 一致性测试结果
- xAPI 1.0.3:1,365 项中通过 1,365 项。xAPI 2.0:1,435 项中通过 1,435 项。
- 套件之外
- 该测试套件声明不测试的要求,每一项都由专门的检查覆盖。已识别出六项未作任何断言的套件测试,并单独予以覆盖。
- 设计使然
- 不接受 OAuth 1.0,因为它已被弃用。该服务由构建在其上的产品以服务器到服务器方式调用,不接受来自浏览器的跨源调用。
接口
- 资源
- Statements、State、Activity Profile、Agent Profile、Activities、Agents 和 About,每个 GET 路由均支持 HEAD。
- 身份验证
- HTTP Basic,使用服务签发的凭据。256 位密钥,仅以带密钥的验证器形式存储。未知、已禁用和已过期的凭据均收到字节完全相同的 401 响应。
- 备用请求语法
- 在 1.0.3 下受支持,在 2.0 下被拒绝,正如该规范所要求。
- 已签名语句
- 支持 RS256、RS384 和 RS512 的 JWS,在包含证书时进行验证。
- 附件
- multipart/mixed,通过 SHA-2 哈希进行匹配。每个附件 5 MiB,每个语句正文 1 MiB,均可配置。
- 分页
- 签名的无状态游标在重启后仍然有效,每个 statements 响应都带有 xAPI 一致性标头。
- 幂等性
- 重新发送相同的 statement id 会被接受,不会产生重复。冲突的 statement id 会被拒绝,并返回 409。
- 速率限制
- 按凭据限制,并为每个客户端地址的失败身份验证设置单独的预算。
隔离与安全
- 租户隔离
- PostgreSQL 行级安全,在所有存储租户数据的表上启用并强制执行。应用程序数据库角色不拥有任何对象,也无法绕过它。每个事务仅从已通过身份验证的凭据获取其租户。
- 隔离,强制执行
- 如果任何租户表或任何在运行时创建的分区缺少该策略,目录测试会使构建失败。
- 静态加密
- 对语句正文、文档、附件、活动定义和凭据身份采用 AES-256-GCM 加密,使用通过 HKDF-SHA256 派生的每条记录独立密钥。
- 密文绑定
- 每个密文都绑定到其所在行的身份,因此无法移动到另一行后仍能解密。
- 密钥保管
- 三把密钥保存在数据库之外,存放于权限为 0600 的密钥文件或环境变量中。没有默认密钥,缺少密钥时服务将拒绝启动。
- 密钥轮换
- 索引密钥通过离线、可续接的重新加密流程进行轮换,轮换凭据密钥会重新签发凭据。每条记录都存储写入它的密钥的 id,因此轮换无需数据迁移。
- 学习者标识符
- 仅以 HMAC-SHA256 令牌形式保存,使用每个租户独立的密钥,因此同一学习者在两个租户中会生成互不相关的令牌。没有任何列以明文保存学习者身份。
- 凭据作用域
- xAPI 作用域集:statements/write、statements/read、statements/read/mine、state、profile、all/read 和 all。最窄的作用域只能读取该凭据自身写入的语句。
- 不可变性
- 语句和附件均为仅追加,由数据库触发器强制执行,拒绝 UPDATE、DELETE 和 TRUNCATE。唯一允许的变更是作废标记和擦除。
- 数据库传输
- 强制要求使用带完整证书和主机名验证的 TLS;否则该服务将拒绝启动。
- 请求审计事件
- 每个请求一条结构化事件,包含请求 id、凭据密钥 id、租户、方法、资源、状态、记录数、时长和筛选器名称。筛选器中的学习者值在记录日志前会被令牌化。
- 篡改可检测性
- 擦除日志采用哈希链,一条命令即可端到端验证整条链。
数据保护
- 擦除
- 一种假名化脱敏处理。在语句可能指明学习者身份的所有位置,学习者都会被替换为随机假名,自由文本回复和附件会被移除,其 State 和 Agent Profile 文档会被删除。不采用物理删除。
- 擦除,已记录
- 每次擦除都会写入哈希链日志。该命令会拒绝不匹配任何内容的擦除,因此输错学习者标识的擦除不会被误认为已完成。
- 备份
- 一旦擦除之前创建的备份过期,擦除即告完成。恢复后,会重放擦除日志。
- 保留期
- 按自然月、按实例执行。该月数据被分离,按租户导出为一个文件,然后删除。除非导出的行数匹配,否则拒绝删除。
- 保留期,按客户
- 需要单独设定保留期的客户须使用专属实例。
- 退出时导出
- 标准 xAPI 接口。客户可以以 xAPI JSON 格式(含其附件)分页浏览每条记录,并全部导出。
- 数据驻留
- 实例在合同要求的区域内运行。该服务仅需一个 PostgreSQL 数据库。
运维与验证
- 部署模式
- 共享的多租户实例,或每个客户一个专用实例。
- 探针可证明其能够失败
- 47 项行为探针中的每一项都必须先针对故意破坏的构建显示为 FAIL,其通过才会被计入,测试框架会强制执行这一点。一致性测试套件同样针对破坏的构建运行,原因相同。
功能
-
已通过一致性测试
通过 ADL LRS Conformance Test Suite 针对 xAPI 1.0.3 的全部 1,365 项测试,以及针对 xAPI 2.0 的全部 1,435 项测试。
-
记录永不改变
一旦存储,语句便无法编辑或覆盖,只能作废,正如标准所规定。
-
设计上隔离
每个客户的记录由数据库内强制执行的规则分隔,而不仅仅依靠应用程序代码。
-
加密且假名化
记录内容在静态存储时加密,学习者标识符仅以带密钥的令牌形式建立索引。
-
带审计跟踪的擦除
学习者的个人数据可应请求从其记录中删除,每次擦除都会记录在可检测篡改的哈希链式日志中。
-
限定作用域的凭据
每个凭据仅限其所需的操作,最细可至只读取其自身写入的记录。
如需文档、试点或集成,联系我们。