2017-02-13 17 views
1

Я использую Loopback3. Я сталкиваюсь с проблемой с моими роли ACL, и я не уверен, что я сделал не так. Я хочу, чтобы пользователи из определенных ролей могли записывать данные в конечную точку, и по какой-то причине пользователь, которого я создал (который находится в одной из этих ролей), не может писать. Я получаю ошибку авторизации.Loopback ACL «Требуется авторизация»

У меня есть 4 роли:

  • администратора
  • внутренний
  • внешний
  • бот

Для этой конечной точки, все прошедшие проверку пользователи могут читать данные, но только администратора, внутренние и бот пользователи могут записывать данные, и только пользователи-администраторы могут удалять данные.

Вот как я получил мои списки ACL определены:

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

У меня есть два пользователя установить, один бот и один является администратором. Когда я выполняю запрос POST для API для любого пользователя, я получаю ошибку «Требуется авторизация», даже когда это делается из интерфейса проводника. Я могу сделать GET без проблем, но POST получает сбой.

Если я удалю все «ПИСАТЬ» acl и замените их на это, выполните POST.

{ 
     "accessType": "WRITE", 
     "principalType": "ROLE", 
     "principalId": "$authenticated", 
     "permission": "ALLOW" 
    }, 

Итак, я может, чтобы это произошло, но я не знаю, почему мои пользовательские роли не удается.

Редактировать: Вот как я создал пользователей, так как на самом деле у меня нет никакого интерфейса.

module.exports = function (app) { 
    let today = new Date(); 

    let admin = { 
     name: 'admin', 
     description: 'admin users', 
     created: today.toJSON(), 
     modified: today.toJSON() 
    }; 

    let internal = { 
     name: 'internal', 
     description: 'Internal users', 
     created: today.toJSON(), 
     modified: today.toJSON() 
    }; 

    let external = { 
     name: 'external', 
     description: 'external users', 
     created: today.toJSON(), 
     modified: today.toJSON() 
    }; 

    let bot = { 
     name: 'bot', 
     description: 'robots', 
     created: today.toJSON(), 
     modified: today.toJSON() 
    }; 

    let model = app.models.user; 

    model.create([ 
     {username: 'bot', email: '[email protected]', password: 'test123'}, 
     {username: 'admin', email: '[email protected]', password: 'test123'}, 
     {username: 'iAdmin', email: '[email protected]', password: 'test123'}, 
     {username: 'eUser', email: '[email protected]', password: 'test123'}, 
    ], function(err, users) { 
     if (err) throw err; 

     app.models.Role.create(bot, function (err, botRole) { 
      if (err) throw err; 

      botRole.principals.create({principalType: app.models.RoleMapping.user, principalID: users[0].id}, function(err, principal) { 
       if (err) throw err; 
      }); 
     }); 

     app.models.Role.create(admin, function (err, adminRole) { 
      if (err) throw err; 

      adminRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[1].id}, function(err, principal) { 
       if (err) throw err; 
      }); 
     }); 

     app.models.Role.create(admin, function (err, internalRole) { 
      if (err) throw err; 

      internalRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[2].id}, function(err, principal) { 
       if (err) throw err; 
      }); 
     }); 

     app.models.Role.create(external, function (err, externalRole) { 
      if (err) throw err; 

      externalRole.principals.create({principalType: app.models.RoleMapping.user, PrincipalID: users[3].id}, function(err, principal) { 
       if (err) throw err; 
      }); 
     }); 
    }); 
}; 
+0

Возможно, проблема заключается в том, где вы создали роли и связали их с пользователем. –

+0

Возможно, я добавил сценарий, который я использовал для создания пользователей в первую очередь. – Lisa

+0

Я считаю, что они должны быть 'app.models.RoleMapping.USER' вместо' app.models.RoleMapping.user' –

ответ

1

Основные вопросы, которые я испытывал вращалась вокруг следующих пунктов:

  1. Использование app.models.RoleMapping.USER вместо app.models.RoleMapping.user (который был изменен в кодовую на ранней стадии)

  2. Использование principalId вместо principalID

Поскольку остальная часть списков ACL была удалена из приложения некоторое время назад из-за того, что они не работали, я не могу сказать, способствовали ли они этим проблемам, но я буду добавлять их в течение долгого времени, используйте правильные разрешения для LB3.

0

Существует разница между ролями и динамическими ролями/состояниями ($ каждым и $ аутентифицировано), в то время как ваши роли откладываются в таблице, чтобы сохранить связь с пользователем $ каждого и $ аутентифицирован это просто состояние пользователя. Посмотрите на таблицу с именем «RoleMapping», если это правильно. Кроме того, если у вас есть настраиваемая роль, создайте настраиваемый RoleResolver.

Существует очень хорошая документация, и на самом деле не так сложно, чтобы начать работу в Loopback 3.

https://loopback.io/doc/en/lb3/Defining-and-using-roles.html

Этот пример дал мне большое понимание ролей в целом:

https://github.com/strongloop/loopback-example-access-control/blob/master/server/boot/role-resolver.js

Это целый проект, чтобы вы могли проверить их там.

0

это как ваш две таблицы должны выглядеть следующим образом:

GET role -->> [table - role] 

[ 
    { 
    "roleId": 1, 
    "name": "admin", 
    "description": "admin", 
    "created": "2016-08-23T16:46:07.572Z", 
    "modified": "2016-08-23T16:46:07.572Z" 
    }, 
    { 
    "roleId": 2, 
    "name": "internal", 
    "description": "internal", 
    "created": "2016-08-23T16:46:07.574Z", 
    "modified": "2016-08-23T16:46:07.574Z" 
    } 
] 


Get Role Mapping [table- user-role]-->> 

[ 
    { 
    "userRoleId": 123, 
    "roleId": 2, //id of role i.e. 1 for admin 
    "principalType": "USER", 
    "principalId": "1234", 
    "created": null, 
    "modified": null 
    }, 
    .. 
    ... 
] 

Так, глядя на свой код, я могу сказать, что вы не добавляете в roleMapping Идентификатор роли таблицы.

Сначала добавьте все роли в таблице ролей

Теперь создать пользователя и добавить запись этого пользователя в роли отображения таблицы и присвоить один Идентификатор роли к нему см в выше коде, где 1 обозначает Идентификатор роли администратора роли.

+0

В моей таблице RoleMapping указано поле roleId, но в поле primaryId нет. – Lisa

0

На самом деле, есть некоторый синтаксис и логическая ошибка вашего кода!

  1. app.models.RoleMapping.USER вместо app.models.RoleMapping.user (как сказал @Farid).
  2. Отсутствует «DELETE» acceessType в loopback acl. вы должны использовать «*», «READ», «WRITE» или «EXECUTE» для значения accesType. «WRITE» поддерживают «create», «updateAttributes», «upsert» и «destroyById». (более подробно в loopback documentation).

Изменить списки доступа, такие следующий код:

"acls": [ { "accessType": "*", "principalType": "ROLE", "principalId": "$everyone", "permission": "DENY" }, { "accessType": "READ", "principalType": "ROLE", "principalId": "$authenticated", "permission": "ALLOW" }, { "accessType": "*", "principalType": "ROLE", "principalId": "admin", "permission": "ALLOW" }, { "principalType": "ROLE", "principalId": "internal", "permission": "ALLOW", "property": ["create", "updateAttributes", "upsert"] }, { "principalType": "ROLE", "principalId": "bot", "permission": "ALLOW", "property": ["create", "updateAttributes", "upsert"] } ]

  1. Наконец, убедитесь, что вы выполняете роль и roleMapping правильно.