Роль в петле не работает, получая ошибку 401 - PullRequest
0 голосов
/ 29 октября 2019

Здравствуйте, я новичок в loopback, и я застрял на создании и использовании ролей. Поэтому в основном я пытаюсь создать две роли, и на основе этих ролей я хочу ограничить доступ некоторых пользователей к некоторымресурсы. Проблема в том, что при каждой попытке get некоторая информация из API я получаю это

{
  "error": {
    "statusCode": 401,
    "name": "Error",
    "message": "Authorization Required",
    "code": "AUTHORIZATION_REQUIRED",
    "stack": "Error: Authorization Required\n    at C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\loopback\\lib\\application.js:433:21\n    at C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\loopback\\lib\\model.js:359:7\n    at C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\loopback\\common\\models\\acl.js:536:16\n    at C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\async\\dist\\async.js:3888:9\n    at C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\async\\dist\\async.js:473:16\n    at iteratorCallback (C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\async\\dist\\async.js:1064:13)\n    at C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\async\\dist\\async.js:969:16\n    at C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\async\\dist\\async.js:3885:13\n    at C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\loopback\\common\\models\\acl.js:518:17\n    at C:\\Users\\HP\\Desktop\\battle-horse\\battle-horse\\node_modules\\loopback\\common\\models\\role.js:447:21\n    at _combinedTickCallback (internal/process/next_tick.js:131:7)\n    at process._tickCallback (internal/process/next_tick.js:180:9)"
  }
}

В моем приложении у меня есть 2 модели:

1.Client (which extends build in User Model) and has role ```bs_client```
2.Admin(which also extends the build in User Model)

Примечаниечто эти модели были созданы с использованием обратной петли cli и еще не создали никаких отношений.

lb model

Я использую Mongodb в качестве базы данных, и вот мой файл источника данных

  "mongodb": {
    "host": "",
    "port": 0,
    "url": "mongodb+srv://general:234234@#/#@##@?retryWrites=true&w=majority",
    "database": "database",
    "password": "password",
    "name": "mongodb",
    "user": "general",
    "useNewUrlParser": true,
    "includeSubDomains": true,
    "useUnifiedTopology": true,
    "connector": "mongodb"
  }

Кажется, чтоданные правильно добавляются в мои коллекции (Role, Rolemapping, Client и Access Token).

Я назначаю роль каждому клиенту динамически при создании, используя этот

 Client.observe('after save', function setRole(ctx, next) {

    if (ctx.instance) {
      if (ctx.isNewInstance) {
        // look up role based on type
        //
        app.models.Role.find({where: {name: 'bs_client'}}, function(err, role) {
          if (err) { return console.log(err); }
          if (role) {

            app.models.RoleMapping.create({
              principalType: app.models.RoleMapping.User,
              principalId: ctx.instance.id,
              roleId: role.id,
            }, function(err, roleMapping) {
              if (err) { return console.log(err); }

              console.log('User assigned RoleID ' + role.id + ' (' + ctx.instance.type + ')');
            });
          };
        });
      }
    } next();
  });

и вот мой model-config.json

{
  "_meta": {
    "sources": [
      "loopback/common/models",
      "loopback/server/models",
      "../common/models",
      "./models"
    ],
    "mixins": [
      "loopback/common/mixins",
      "loopback/server/mixins",
      "../common/mixins",
      "./mixins"
    ]
  },
  "User": {
    "dataSource": "mongodb",
    "public": false
  },
  "AccessToken": {
    "dataSource": "mongodb",
    "public": false
  },
  "ACL": {
    "dataSource": "mongodb",
    "public": false
  },
  "RoleMapping": {
    "dataSource": "mongodb",
    "public": true,
    "options": {
      "strictObjectIDCoercion": true
    }
  },
  "Role": {
    "dataSource": "mongodb",
    "public": true
  },
  "Email": {
    "dataSource": "Email"
  },
  "Client": {
    "dataSource": "mongodb",
    "public": true
  },
}

и в client.json

"acls": [
    {
      "accessType": "*",
      "principalType": "CLIENT",
      "principalId": "bs_client",
      "permission": "DENY"
    },
    {
      "accessType": "READ",
      "principalType": "CLIENT",
      "principalId": "bs_client",
      "permission": "ALLOW"
    },
    {
      "accessType": "EXECUTE",
      "principalType": "CLIENT",
      "principalId": "$authenticated",
      "permission": "ALLOW",
      "property": "create"
    },
    {
      "accessType": "WRITE",
      "principalType": "CLIENT",
      "principalId": "bs_client",
      "permission": "ALLOW"
    }
  ],

После https://loopback.io/doc/en/lb3/Model-property-reference.html, все должно работать нормально, почему я 'Я не могу получить "клиентов", используя конфигурацию выше.

Спасибо, яN заранее.

1 Ответ

1 голос
/ 30 октября 2019

Эта строка должна выглядеть везде в «acls»: «PrincipalType»: «ROLE»,

пример ACL:

  "acls": [
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "DENY"
    },
    {
      "accessType": "READ",
      "principalType": "ROLE",
      "principalId": "$authenticated",
      "permission": "ALLOW"
    },
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "admin",
      "permission": "ALLOW"
    }
  ],    
...