Loopback NodeJS — проверьте роль пользователя при входе в систему

У меня есть приложение, использующее Angular 5 для внешнего интерфейса, NodeJS для внутреннего интерфейса, и я использую петлю для создания API. У меня есть удаленный метод, который я использую для входа пользователя, это работает. Теперь я хотел изменить этот метод, чтобы также проверить, является ли пользователь администратором, однако я не могу этого сделать. По какой-то причине, когда я делаю вызов API к модели RoleMappings, используя /api/RoleMappings?filter={where: {"principalId": ID_VALUE}, это не работает. ID_VALUE также является user_id администратора, поскольку эта роль и администратор создаются программно, поэтому я знаю, что должен быть PrincipalId — это userId.

Я делаю запрос на проверку роли как вложенный запрос, сначала я проверяю, вошел ли пользователь в систему (если пользователь даже не входит в систему, нет смысла проверять, является ли он администратором), затем я проверяю, если что пользователь оказывается админом. Это код, любая помощь будет оценена по достоинству.

Я протестировал вызов API с помощью IBM API connect, и он сработал, просто он не хочет работать из моего кода. Этот запрос не выдает ошибку, но ответ содержит код 400, а тело пусто.

БД, в которой хранятся сопоставления ролей, — это CloudantDB.

var options = {
            method: 'POST',
            url: conf.endpoint + 'api/Clients/login',
            headers: this.headers,
            body: user,
            json: true
        }

        request(options, function (error, response, body) {
          if (error) return callback(error);

            //
            var adminOptions = {
            method: 'GET',
            url: conf.endpoint + '/api/RoleMappings',
            qs: {filter: {"where":{"principalId": "\""+body.userId"\"","roleId":"159882e4a5bdde9cc725eee8c13a1030"}}},
            headers: this.headers 
          }

          request(adminOptions, function(aReqErr, aRes, aBody){
            if(aReqErr) return callback(aReqErr);

            //console.log("Admin check success: ", aRes);
            if(aBody){
            var pId = aBody[0].principalId;
            console.log("Admin check success:", aBody);
            if(pId){
                body["isAdmin"] = true;
            }else{
                body["isAdmin"] = false;
            }
        }else{

            console.log("aResCode", aRes.statusCode);
            console.log("aResMessage", aRes.statusMessage);
            //console.log("aReqErr", aReqErr);
        }

          });

          //console.log('Success: ', typeof body);

          callback(null, body);

        });

person D. Gal    schedule 30.01.2018    source источник


Ответы (1)


Я бы дважды проверил, что модель RoleMapping общедоступна в model-config.json, что потребуется для отправки запроса GET.

У меня есть аналогичный запрос в коде модели, который выглядит так:

app.models.RoleMapping.find({
  where: {
     principalId: userId,
     roleId: roleId
  }
}, cb)

Учитывая, что ваша строка фильтра выглядит так:

?filter={"where":{"principalId":<userId>,"roleId":<roleId>}}

Я ожидаю, что это сработает, основываясь на моем опыте. Единственное, о чем я могу думать, это, возможно, форматирование для userId неверно, вы можете попробовать отбросить экранированные кавычки вокруг него, чтобы это выглядело так:

qs: {
  filter: {
    where: {
       principalId: body.userId,
       roleId: "159882e4a5bdde9cc725eee8c13a1030"
    }
  }
}
person Aidan H.    schedule 30.01.2018