Архив за мая, 2015

LoopBack Framework, настройка ACL

17 мая, 2015 | Комментариев нет

Отличный фреймворк, но настраивать ACL в нём просто АДЪ(если не знать хитрость)

Единственный разумный способ сделать это занятие приятным — запуск специального DEBUG режима.

1. Для запуска проекта из текущей директории в режиме отладки ACL нужно сделать:

DEBUG=loopback:security:* node .

2. Выполните REST запрос, который пытаетесь задебажить. Допустим, нас интересует

Request URL:http://eventovka.dev/api/BaseUsers/55575aa2f2e0436f0defcdc8/events
Request Method:POST

3. Ответом(в консоле браузера) должно быть что-то вида:

Status Code:401 Unauthorized
 
{"error":{"name":"Error","status":401,"message":"Authorization Required","statusCode":401,"code":"AUTHORIZATION_REQUIRED","stack":"Error: Authorization Required\n    at /srv/eventovka/api/node_modules/loopback/lib/application.js:348:21\n    at /srv/eventovka/api/node_modules/loopback/lib/model.js:313:7\n    at /srv/eventovka/api/node_modules/loopback/common/models/acl.js:465:23\n    at /srv/eventovka/api/node_modules/loopback/node_modules/async/lib/async.js:254:17\n    at done (/srv/eventovka/api/node_modules/loopback/node_modules/async/lib/async.js:135:19)\n    at /srv/eventovka/api/node_modules/loopback/node_modules/async/lib/async.js:32:16\n    at /srv/eventovka/api/node_modules/loopback/node_modules/async/lib/async.js:251:21\n    at /srv/eventovka/api/node_modules/loopback/node_modules/async/lib/async.js:575:34\n    at /srv/eventovka/api/node_modules/loopback/common/models/acl.js:447:17\n    at /srv/eventovka/api/node_modules/loopback/common/models/role.js:290:23"}}

4. В логе сервер должно быть что-то вида:

  loopback:security:acl The following ACLs were searched:  +1ms
  loopback:security:acl ---ACL--- +1ms
  loopback:security:acl model BaseUser +0ms
  loopback:security:acl property * +0ms
  loopback:security:acl principalType ROLE +1ms
  loopback:security:acl principalId $everyone +0ms
  loopback:security:acl accessType * +0ms
  loopback:security:acl permission DENY +0ms
  loopback:security:acl with score: +0ms 7495
  loopback:security:acl ---ACL--- +0ms
  loopback:security:acl model BaseUser +0ms
  loopback:security:acl property * +3ms
  loopback:security:acl principalType ROLE +0ms
  loopback:security:acl principalId $everyone +0ms
  loopback:security:acl accessType * +1ms
  loopback:security:acl permission DENY +0ms
  loopback:security:acl with score: +0ms 7495
  loopback:security:acl ---Resolved--- +1ms
  loopback:security:access-context ---AccessRequest--- +0ms
  loopback:security:access-context  model BaseUser +0ms
  loopback:security:access-context  property __create__events +1ms
  loopback:security:access-context  accessType WRITE +0ms
  loopback:security:access-context  permission DENY +0ms
  loopback:security:access-context  isWildcard() false +0ms
  loopback:security:access-context  isAllowed() false +0ms

6. Нас интересует, вызванная модель и её атрибут(метод). В логе они фигугируют как model и property.

Таким образом нам нужно настроить

model: BaseUser
property: __create__events

7. Добавляем необходимое ACL условие в json конфиг модели:

    {
      "principalType": "ROLE",
      "principalId": "$authenticated",
      "permission": "ALLOW",
      "property": "__create__events"
    }

Результат должен выглядеть примерно так(нижнее условие):
e5057a5b8f36cc0ae9a0d85be7559fdf