You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Loopback权限异常:所有用户可访问仅所有者可见的Thing模型资源

修复Loopback中Thing模型的所有者权限问题

看起来你的Thing模型ACL规则写了一半,而且缺少关键的权限限制逻辑,这就是为什么所有用户都能访问不属于他们的Thing数据。我来帮你把这个问题彻底解决:

核心问题分析

你当前的ACL片段只写了{ "accessType": "*",,没有完整的规则来限制只有资源所有者才能访问。Loopback的ACL是按顺序匹配规则的,必须先设置默认拒绝,再给特定角色(比如$owner)开放权限。

完整的Thing模型ACL配置

把你的thing.json里的acls部分替换成下面的完整配置:

"acls": [
  // 1. 默认拒绝所有用户的所有操作(安全基线)
  {
    "accessType": "*",
    "principalType": "ROLE",
    "principalId": "$everyone",
    "permission": "DENY"
  },
  // 2. 允许资源所有者($owner)对自己的Thing执行所有操作
  {
    "accessType": "*",
    "principalType": "ROLE",
    "principalId": "$owner",
    "permission": "ALLOW"
  },
  // 3. 允许已认证用户创建Thing(创建时自动关联自己的userId)
  {
    "accessType": "CREATE",
    "principalType": "ROLE",
    "principalId": "$authenticated",
    "permission": "ALLOW"
  },
  // 可选:如果有管理员角色,允许管理员访问所有Thing数据
  {
    "accessType": "*",
    "principalType": "ROLE",
    "principalId": "admin",
    "permission": "ALLOW"
  }
]

规则解释

  • 默认拒绝:第一条规则先拒绝所有用户的所有操作,确保没有明确授权的行为都被禁止,这是安全开发的最佳实践。
  • 所有者权限:$owner是Loopback的内置角色,它会自动检查当前登录用户的id是否与Thing模型的userId字段匹配,只有匹配时才允许访问。
  • 创建权限:允许已认证用户创建Thing,因为用户需要生成属于自己的资源。

确保userId自动关联(关键!)

光有ACL还不够,必须确保创建Thing时userId字段被正确设置为当前登录用户的ID。你可以在Thing模型的JS文件里添加一个beforeSave钩子来自动完成这个操作:

// common/models/thing.js
module.exports = function(Thing) {
  Thing.beforeSave((ctx, next) => {
    // 只有创建新实例且用户已登录时,自动设置userId
    if (ctx.isNewInstance && ctx.options.accessToken) {
      ctx.instance.userId = ctx.options.accessToken.userId;
    }
    next();
  });
};

这样用户创建Thing时不需要手动传递userId,系统会自动关联当前登录用户,确保所有权正确绑定。

测试验证

配置完成后,你可以做以下测试:

  • 用用户A登录,创建一个Thing,然后用用户B登录,尝试访问用户A的Thing,应该返回403 Forbidden。
  • 用户A自己访问、修改、删除自己的Thing,应该正常操作。

内容的提问来源于stack exchange,提问作者theJuls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:26:42