当我访问模型文件夹中的自定义方法时,我收到401错误

时间:2018-10-18 10:35:27

标签: database loopbackjs strongloop

我正在使用回送访问/更新/更改数据库。我在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" }
        });

当我尝试通过动作文件夹(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永远不会显示在我运行节点的窗口中。

  1. 我在前端收到401状态错误消息。

这是我的StrongLoop gui的图片。 enter image description here

这是我的account.json文件的图片

这是以前的开发人员创建的一种方法的图片,该方法当前可以正常使用而不会出现状态错误。 deleteSingleHearingTest几乎相同。

enter image description here enter image description here

1 个答案:

答案 0 :(得分:2)

从我的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方法,但是User模型的详细信息只能由用户自己($owner)检索。 / p>

请参阅LoopBack文档中的Controlling data accessUnderstanding the built-in User model了解更多信息。

为了允许您的用户执行Account.deleteSingleHearingTest方法,您需要向Account配置中添加新的ACL条目。我相信LoopBack可以合并基本模型(User)中定义的ACL和自pull request #1289起子类模型(Account)中定义的其他ACL条目。如果是这种情况,则需要只需在您的common/models/account.json文件中添加一个新的ACL条目即可。假设任何登录用户都可以调用deleteSingleHearingTest,但是匿名(未经身份验证)用户不能:

{
  "name": "Account",
  "base": "User",
  // ...
  "acls": [
    {
      "principalType": "ROLE",
      "principalId": "$authenticated",
      "permission": "ALLOW",
      "property": "deleteSingleHearingTest"
    }
  ]
}