簡體   English   中英

回送按管理員創建用戶,但按用戶更新配置文件

[英]loopback create user by admin but update profile by user

我嘗試使用以下模型在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));
};

現在一切對我來說都可以。
只有管理員可以創建新用戶並執行任何操作。
$ everyone只能登錄注銷確認帳戶。
但是我對$ owner部分有一些問題。 由於現在由admin完成用戶創建,因此“ admin”是任何其他用戶的所有者,沒有人不能使用findByIdupdateAttributes (更新配置文件)。


更新:

我再次測試,新用戶可以使用findById(GET / Employees / {id})(我不知道為什么它起作用了,但這就是我們所需要的)。BUUUUT另一個問題,新用戶不能使用updateAttributes(PATCH / Employees / { id})並顯示以下錯誤:

Authorization Required

為什么findById (GET / Employees / {id})有效?
為什么要使用updateAttributes (PATCH / Employees / {id})?
為什么這兩個不一樣?
您可以指導我如何解決此問題嗎? 我什么都找不到。

當前基於您的ACL,只有記錄的所有者才可以更新/刪除任何數據,為了允許其他用戶,您必須將ACL updateAttributes主體ID更改為$ authenticated。

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

但是這種方法允許任何經過身份驗證的用戶更改任何其他概要文件,因此,為防止此操作,您可以添加一個beforeRemote鈎子查找來查找當前userId和概要文件userId以進行比較,並允許此值匹配。

但是我對$ owner部分有一些問題。 由於管理員已完成用戶創建,因此“ admin”是任何其他用戶的所有者

如果您使用端點POST /Employees創建新用戶,則不正確。 管理員不是$ owner。 請參閱回送文檔

為了使$ owner合格,目標模型需要具有與User模型的belongsTo關系以及與目標模型實例的外鍵匹配的屬性。 $ owner的檢查僅對路徑上具有':id'的遠程方法執行,例如GET / api / users /:id。

另外,您將重新定義findById和updateAttributes ACL,但是它們已經在回送中作為基本用戶的一部分進行了定義 因此,您可以刪除這兩行。

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

現在,您在ACLS上有奇怪的行為,並且使用的自定義mixin與acls注冊混為一談。 我不太清楚這個mixin應該做什么,但是我最好的猜測是問題出在此。

從您的項目中刪除該文件,重新啟動服務器並進行測試。 應該解決您的問題。

最后,我找到了一個可行的解決方案:我更改了這一行:

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

到下面的行:

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

我在此文件中找到它。

這是一個文檔問題其中updateAttributes更改為patchAttributes但在文檔中未更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM