[英]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”是任何其他用戶的所有者,沒有人不能使用findById或updateAttributes (更新配置文件)。
更新:
我再次測試,新用戶可以使用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.