当我访问 Models 文件夹中的自定义方法时收到 401 错误
I receive a 401 error when I access a custom method inside my Models folder
我正在使用环回 access/update/make 更改我的数据库。我在 common/models 文件夹中创建了一个名为 deleteSingleHearingTest 的方法:
Account.deleteSingleHearingTest = function (req, callback) {
console.log('accounts.js: deleteSingleHearingTest: are we being reached????', req)
Account.findById(req.accessToken.userId)
.then(account => {
if (!account) {
throw new Error('Cannot find user');
}
console.log('account.js: deleteSingleHearingTest: req: ', req);
return app.models.HearingTest.updateAll({ accountId: account.id, id: req.body.hearingTestId }, { isDeleted: new Date() });
})
.then(() => {
callback(null);
})
.catch(error => {
callback(error);
});
}
之后我创建了一个远程方法:
Account.remoteMethod(
'deleteSingleHearingTest', {
http: {
path: '/deleteSingleHearingTest',
verb: 'post'
},
accepts: [
{ arg: 'req', type: 'object', http: { source: 'req' } }
],
returns: { "wtf": "wtf" }
});
当我尝试通过 fetch 在我的操作文件夹 (redux) 中名为 deleteSingleHearingTest 的方法中使用它时,我收到 401 状态错误消息:
export const deleteSingleHearingTest = (hearingTestNumber) => {
return (dispatch, getState) => {
let state = getState();
if (!state.user || !state.user.accessToken || !state.user.accessToken.id || !state.user.accessToken.userId) {
console.debug('writeTestResult', state.user);
// TODO: ERROR
return;
}
dispatch({
type: DELETE_SINGLE_REPORT_REQUEST
});
console.log('here is your access token', state.user.accessToken);
fetch(SERVERCONFIG.BASEURL + '/api/Accounts/deleteSingleHearingTest?access_token=' + state.user.accessToken.id, {
method: 'POST',
headers: SERVERCONFIG.HEADERS,
body: JSON.stringify({ "hearingTestId": hearingTestNumber })
})
.then(response => {
if (response.status === 200) {
console.log('actions/user.js deleteSingleReport were in the pipe 5x5', response.json());
}
console.log('actions/user.js failed to delete item: response: ', response)
})
}
};
我注意到两个错误:
1. Account.deleteSingleHearingTest 永远达不到。我知道这一点,因为 console.log 从未出现在 window 中,我 运行 节点 .
- 我在前端收到 401 状态错误消息。
这是我的 StrongLoop gui 的图片。
这是我的 account.json 文件的图片
这是一张以前的开发人员创建的方法的图片,该方法目前可以正常工作,没有任何状态错误。 deleteSingleHearingTest 几乎相同。
根据我查看您的 API Explorer 屏幕截图可以看出,您的 Account
模型正在扩展 LoopBack 的内置 User
模型。 User
模型将 ACL 配置为拒绝访问除少数明确允许的方法之外的所有方法。您可以在 common/models/user.json.
中找到 ACL 配置
"acls": [
{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW",
"property": "create"
},
{
"principalType": "ROLE",
"principalId": "$owner",
"permission": "ALLOW",
"property": "deleteById"
},
{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW",
"property": "login"
},
// etc.
]
第一个条目拒绝访问所有方法,后续条目允许某些用户组访问某些方法。例如,任何人 ($everyone
) 都可以创建新用户或调用 login
方法,但是用户模型的详细信息只能由用户自己 ($owner
) 检索。
请参阅 LoopBack 文档中的 Controlling data access and Understanding the built-in User model 以了解更多信息。
为了允许您的用户执行 Account.deleteSingleHearingTest
方法,您需要在 Account
配置中添加一个新的 ACL 条目。我相信 LoopBack 可以合并基本模型中定义的 ACL(User)
与子类模型中定义的附加 ACL 条目(Account
)截至 pull request #1289。如果是这种情况,那么您需要只需在 common/models/account.json
文件中添加一个新的 ACL 条目。假设任何登录用户都可以调用 deleteSingleHearingTest
,但匿名(未经身份验证的)用户不能:
{
"name": "Account",
"base": "User",
// ...
"acls": [
{
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW",
"property": "deleteSingleHearingTest"
}
]
}
我正在使用环回 access/update/make 更改我的数据库。我在 common/models 文件夹中创建了一个名为 deleteSingleHearingTest 的方法:
Account.deleteSingleHearingTest = function (req, callback) {
console.log('accounts.js: deleteSingleHearingTest: are we being reached????', req)
Account.findById(req.accessToken.userId)
.then(account => {
if (!account) {
throw new Error('Cannot find user');
}
console.log('account.js: deleteSingleHearingTest: req: ', req);
return app.models.HearingTest.updateAll({ accountId: account.id, id: req.body.hearingTestId }, { isDeleted: new Date() });
})
.then(() => {
callback(null);
})
.catch(error => {
callback(error);
});
}
之后我创建了一个远程方法:
Account.remoteMethod(
'deleteSingleHearingTest', {
http: {
path: '/deleteSingleHearingTest',
verb: 'post'
},
accepts: [
{ arg: 'req', type: 'object', http: { source: 'req' } }
],
returns: { "wtf": "wtf" }
});
当我尝试通过 fetch 在我的操作文件夹 (redux) 中名为 deleteSingleHearingTest 的方法中使用它时,我收到 401 状态错误消息:
export const deleteSingleHearingTest = (hearingTestNumber) => {
return (dispatch, getState) => {
let state = getState();
if (!state.user || !state.user.accessToken || !state.user.accessToken.id || !state.user.accessToken.userId) {
console.debug('writeTestResult', state.user);
// TODO: ERROR
return;
}
dispatch({
type: DELETE_SINGLE_REPORT_REQUEST
});
console.log('here is your access token', state.user.accessToken);
fetch(SERVERCONFIG.BASEURL + '/api/Accounts/deleteSingleHearingTest?access_token=' + state.user.accessToken.id, {
method: 'POST',
headers: SERVERCONFIG.HEADERS,
body: JSON.stringify({ "hearingTestId": hearingTestNumber })
})
.then(response => {
if (response.status === 200) {
console.log('actions/user.js deleteSingleReport were in the pipe 5x5', response.json());
}
console.log('actions/user.js failed to delete item: response: ', response)
})
}
};
我注意到两个错误:
1. Account.deleteSingleHearingTest 永远达不到。我知道这一点,因为 console.log 从未出现在 window 中,我 运行 节点 .
- 我在前端收到 401 状态错误消息。
这是我的 StrongLoop gui 的图片。
这是我的 account.json 文件的图片
这是一张以前的开发人员创建的方法的图片,该方法目前可以正常工作,没有任何状态错误。 deleteSingleHearingTest 几乎相同。
根据我查看您的 API Explorer 屏幕截图可以看出,您的 Account
模型正在扩展 LoopBack 的内置 User
模型。 User
模型将 ACL 配置为拒绝访问除少数明确允许的方法之外的所有方法。您可以在 common/models/user.json.
"acls": [
{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW",
"property": "create"
},
{
"principalType": "ROLE",
"principalId": "$owner",
"permission": "ALLOW",
"property": "deleteById"
},
{
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW",
"property": "login"
},
// etc.
]
第一个条目拒绝访问所有方法,后续条目允许某些用户组访问某些方法。例如,任何人 ($everyone
) 都可以创建新用户或调用 login
方法,但是用户模型的详细信息只能由用户自己 ($owner
) 检索。
请参阅 LoopBack 文档中的 Controlling data access and Understanding the built-in User model 以了解更多信息。
为了允许您的用户执行 Account.deleteSingleHearingTest
方法,您需要在 Account
配置中添加一个新的 ACL 条目。我相信 LoopBack 可以合并基本模型中定义的 ACL(User)
与子类模型中定义的附加 ACL 条目(Account
)截至 pull request #1289。如果是这种情况,那么您需要只需在 common/models/account.json
文件中添加一个新的 ACL 条目。假设任何登录用户都可以调用 deleteSingleHearingTest
,但匿名(未经身份验证的)用户不能:
{
"name": "Account",
"base": "User",
// ...
"acls": [
{
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW",
"property": "deleteSingleHearingTest"
}
]
}