Loopback предоставляет отличный ACL «ACL» на уровне класса для ограничения доступа к целой модели или ее Mehods, но в значительной степени не хватает возможности ограничивать доступ к отдельным объектам. Этот проект пытается решить это, установив ACL на уровне объектов на каждом объекте, и манипулирует запросом Loopback только для возврата объектов, к которому есть доступ пользователя.
Circleci:
Допустим, мы хотим, чтобы книжный объект был только читаемым (каламбур) 3 пользователями (ID: «AAA», ID: «BBB» и ID: «CCC»):
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Миксин проанализирует объект, который будет храниться, как в Монго:
{
id : ObjectId ( "123" ) ,
title : "Clean Code" ,
subtitle : "A Handbook of Agile Software Craftsmanship" ,
r : {
u : [ "aaa" , "bbb" , "ccc" ]
g : [ ]
} ,
w : {
u : [ ] ,
g : [ ]
}
}Теперь к этому объекту можно получить доступ только пользователь с идентификатором «AAA», «BBB» или «CCC» и никого другого. При извлечении микшин снова проанализирует ACL объекта:
GET /api/books/123
authorization: accessToken-aaa
Возвращает:
{
"id" : "123"
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}В то время как запрос без разрешений приводит к:
GET /api/books/123
authorization: accessToken-ddd
Возвращает:
404 Not found
Для определения каждого пользователя, который будет иметь доступ к объекту, может быть громоздким и временным обслуживанием. Вот где группы пригодятся.
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "group-id-1" ]
}
}
} Как вы могли догадаться, этот объект теперь доступен пользователям, у которых group-id-1 указан в acl_groups на пользовательском объекте.
Если user-id-1 и user-id-2 не находятся в group-id-1 , эти пользователи могут иметь явный доступ таким образом:
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "group-id-1" ] ,
"users" : [ "user-id-1" , "user-id-2" ]
}
}
} Если вы установили Mixin на свою модель, но вы не указываете $acl на создание нового объекта, видимость объектов будет публичной, пример:
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship"
}возврат
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "*" ] ,
"users" : [ "*" ]
} ,
"w_perm" : {
"groups" : [ "*" ] ,
"users" : [ "*" ]
}
}
} npm install --save loopback-object-acl
В model-config.json добавить ../node_modules/loopback-object-acl в микшины
"_meta" : {
"sources" : [
"loopback/common/models" ,
"loopback/server/models" ,
"../common/models" ,
"./models"
] ,
"mixins" : [
"loopback/common/mixins" ,
"loopback/server/mixins" ,
"../common/mixins" ,
"./mixins" ,
"../node_modules/loopback-object-acl"
]
} Установите ObjectAclController на то, что вы хотели бы защитить с помощью ACL на уровне объекта:
book . json
{
"name" : "Book" ,
"base" : "PersistedModel" ,
"idInjection" : true ,
"options" : {
"validateUpsert" : true
} ,
"mixins" : {
"ObjectAclController" : { }
}
. . .
} Этот микшины ожидают объекта currentUser в объекте options . Это не поведение по умолчанию по умолчанию v3.x поведение и должно быть реализовано до использования.
Реализация может найти здесь: http://loopback.io//doc/en/lb3/using-current-context.html#use-a-custom-strong-remoting-phase
Этот микшин тестируется только с помощью Loopback v3.x и использует MongoDB в качестве данных
Версия 2.0