Я получаю сообщение об ошибке 401 при доступе к пользовательскому методу внутри папки Models - PullRequest
0 голосов
/ 18 октября 2018

Я использую Loopback для доступа / обновления / внесения изменений в мою базу данных.Я создал метод deleteSingleHearingTest в своей папке common / models:

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 внутриметод deleteSingleHearingTest в моей папке действий (redux) Я получаю сообщение об ошибке состояния 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 никогда не появляется в окне, где я запускал узел.

Я получаю сообщение об ошибке состояния 401 на внешнем интерфейсе.

Вот изображение моего графического интерфейса StrongLoop.enter image description here

Вот изображение моего файла account.json

Вот изображение метода, созданного предыдущим разработчиком, который в настоящее время работает без ошибок состояния.deleteSingleHearingTest практически идентичен.

enter image description here enter image description here

1 Ответ

0 голосов
/ 18 октября 2018

Судя по скриншоту API Explorer, ваша модель Account расширяет встроенную модель LoopBack User.Модель User имеет списки ACL, настроенные на запрет доступа ко всем методам, кроме нескольких явно разрешенных.Конфигурацию 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, но детали модели User могут быть получены только самим пользователем ($owner).

Пожалуйста,обратитесь к Управление доступом к данным и Понимание встроенной пользовательской модели в документации LoopBack, чтобы узнать больше.

Чтобы пользователи могли выполнять метод Account.deleteSingleHearingTestнеобходимо добавить новую запись ACL в вашу конфигурацию Account.Я полагаю, что LoopBack может объединить ACL, определенный в базовой модели (User), с дополнительными записями ACL, определенными в модели подклассов (Account), начиная с запроса на получение # 1289 . Если это так, то вам нужнопросто добавить новую запись ACL в ваш файл common/models/account.json. Предполагается, что любой вошедший в систему пользователь может вызвать deleteSingleHearingTest, но анонимные (не прошедшие проверку подлинности) пользователи не могут:

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