Отличный фреймворк, но настраивать 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" } |