【问题标题】:loopback create user by admin but update profile by user环回由管理员创建用户,但由用户更新配置文件
【发布时间】:2017-05-10 19:49:27
【问题描述】:

我尝试使用以下模型在 LoopBack 3 API 中管理我的用户管理:

{
  "name": "Employee",
  "plural": "Employees",
  "base": "User",
  "idInjection": true,
  "options": {
    "validateUpsert": true,
    "strict": true
  },
  "mixins": {
    "ClearBaseAcls": true
  },
  "hidden": [
    "password",
    "verificationToken"
  ],
  "properties": {
    "name": {
      "type": "string",
      "required": true
    },
    "family": {
      "type": "string",
      "required": true
    }
  },
  "validations": [],
  "relations": {},
  "acls":
    [ { "principalType": "ROLE", "principalId": "$everyone", "permission": "DENY" },
      { "principalType": "ROLE", "principalId": "$everyone", "permission": "ALLOW", "property": "login" },
      { "principalType": "ROLE", "principalId": "$everyone", "permission": "ALLOW", "property": "logout" },
      { "principalType": "ROLE", "principalId": "$everyone", "permission": "ALLOW", "property": "confirm" },

      { "principalType": "ROLE", "principalId": "admin", "permission": "ALLOW" },

      { "principalType": "ROLE", "principalId": "$owner", "permission": "ALLOW", "property": "findById" },
      { "principalType": "ROLE", "principalId": "$owner", "permission": "ALLOW", "property": "updateAttributes" }
    ],
  "methods": {}
}

并且也使用这个 mixis: (ClearBaseAcls)

'use strict';

const path = require('path');
const appRoot = require('app-root-path');

function slugify(name) {
  name = name.replace(/^[A-Z]+/, s => s.toLowerCase());
  return name.replace(/[A-Z]/g, s => '-' + s.toLowerCase());
}

module.exports = (Model) => {
  const configFile = path.join('./common/models/', slugify(Model.modelName) + '.json');
  const config = appRoot.require(configFile);

  if (!config || !config.acls) {
    console.error('ClearBaseAcls: Failed to load model config from', configFile);
    return;
  }

  Model.settings.acls.length = 0;
  config.acls.forEach(r => Model.settings.acls.push(r));
};

现在对我来说一切都很好。
只有admin可以创建新用户并做任何事情。
$everyone只能login退出确认帐户。
但我对 $owner 部分有一些问题。由于管理员创建的用户现在“管理员”是任何其他用户的所有者,没有人不能使用 findByIdupdateAttributes(更新配置文件)。


更新:

我再次测试,新用户可以使用 findById ( GET /Employees/{id} ) (我不知道它为什么有效,但这就是我们所需要的)BUUUUT 另一个问题,新用户不能使用 updateAttributes ( PATCH / Employees/{id} )并显示以下错误:

Authorization Required

为什么 findById ( GET /Employees/{id} ) 有效??
为什么是 updateAttributes ( PATCH /Employees/{id} )??
为什么这两个不一样?
你能指导我如何解决这个问题吗?我找不到任何关于此的信息。

【问题讨论】:

  • 您是否使用与用户连接的同一 ID? $owner 只能通过关系直接连接到 $owner 的主题。要使 updateAttributes 起作用,它必须是用户所附加的员工 ID。
  • 嗨@Undrium,是的,我使用的是同一个ID。我认为这是一个错误。请看这个问题:github.com/strongloop/loopback/issues/3379

标签: javascript node.js acl loopbackjs loopback


【解决方案1】:

根据您的 ACL,目前只有记录的所有者才能更新/删除任何数据,为了允许其他用户,您必须将 ACL updateAttributes the principalId 更改为 $authenticated。

"acls":
[ 
  { "principalType": "ROLE", "principalId": "$authenticated", "permission": "ALLOW", "property": "updateAttributes" }
],

但是这种方法允许任何经过身份验证的用户更改任何其他配置文件,因此为了防止此操作,您可以添加 beforeRemote hook 查找当前 userId 和配置文件 userId 以比较它们并在此值匹配时允许。

【讨论】:

  • 感谢您的关注。你能指导我关于 beforeRemote 钩子吗?我不知道我们如何在 hook 中检查 userId。
  • 我不认为是这里的问题,这个acl规则已经在base User model的环回中定义了。应该不是问题。
  • 带有 $authenticated 的 ACL 总是返回“需要授权”错误
【解决方案2】:

但是我对 $owner 部分有一些问题。由于管理员创建的用户现在“管理员”是任何其他用户的所有者

如果您使用端点POST /Employees 创建新用户,则不正确。管理员不是 $owner。见loopback doc

要限定 $owner,目标模型需要具有与用户模型的 belongsTo 关系以及与目标模型实例的外键匹配的属性。 $owner 的检查仅针对路径上具有“:id”的远程方法执行,例如 GET /api/users/:id。

此外,您正在重新定义 findById 和 updateAttributes acls,但 they are already defined in loopback 是基本用户的一部分。所以你可以删除这两行。

 { "principalType": "ROLE", "principalId": "$owner", "permission": "ALLOW", "property": "findById" },
 { "principalType": "ROLE", "principalId": "$owner", "permission": "ALLOW", "property": "updateAttributes" }

现在,您在使用 ACLS 时遇到了奇怪的行为,并且您正在使用与 acls 注册混淆的自定义 mixin。我不明白这个 mixin 应该做什么,但我最好的猜测是问题出在它身上。

从您的项目中删除此文件,重新启动服务器并在没有它的情况下进行测试。应该可以解决您的问题。

【讨论】:

    【解决方案3】:

    最后我找到了一个可行的解决方案: 我改变了这一行:

    { "principalType": "ROLE", "principalId": "$owner", "permission": "ALLOW", "property": "updateAttributes" }
    

    到下一行:

    { "principalType": "ROLE", "principalId": "$owner", "permission": "ALLOW", "property": "patchAttributes" }
    

    我在this file找到它。

    这是一个文档问题here,其中updateAttributes 更改为patchAttributes,但在文档中没有更改。

    【讨论】:

    • 重新定义与 User 模型中已经定义的 ACL 完全相同的 ACL 有什么意义? (如果你读过它,这就是我的回答的重点)。此外,一旦有新的 3.X 版本,您将再次遇到此错误,因为它已在 3.X latest 中修复。
    • 因为我想用 ClearBaseAcls 覆盖所有用户权限。请在投票前完整阅读问题。
    • 请更好地解释你的问题,因为如果没有它调用的配置文件,这个 mixin 正在做什么是无法理解的。现在您也应该更好地阅读我的评论,因为我提供的链接清楚地表明此答案是错误的,并且您将来会遇到错误。适合自己。
    猜你喜欢
    • 2016-05-09
    • 2018-10-15
    • 2020-04-02
    • 2012-04-30
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多