O Loopback fornece ótimos ACLs de "nível de classe" para restringir o acesso a um modelo inteiro ou a seus mehods, mas carece muito da capacidade de restringir o acesso a objetos individuais. Este projeto tenta resolver isso, definindo os ACLs no nível do objeto em cada objeto, e manipula a consulta do Loopback para retornar apenas objetos aos quais o usuário solicitante tem acesso.
Circleci:
Digamos que queremos que um objeto de livro seja legível (trocadilho) por 3 usuários (ID: "AAA", ID: "BBB" e ID: "CCC"):
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}O mixin analisará o objeto a ser armazenado como em Mongo:
{
id : ObjectId ( "123" ) ,
title : "Clean Code" ,
subtitle : "A Handbook of Agile Software Craftsmanship" ,
r : {
u : [ "aaa" , "bbb" , "ccc" ]
g : [ ]
} ,
w : {
u : [ ] ,
g : [ ]
}
}Agora, esse objeto pode ser acessado apenas por um usuário com um ID de "AAA", "BBB" ou "CCC" e mais ninguém. Ao recuperar, o mixin analisará o ACL do objeto de volta novamente:
GET /api/books/123
authorization: accessToken-aaa
Retornos:
{
"id" : "123"
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Considerando que solicitar sem permissões leva a:
GET /api/books/123
authorization: accessToken-ddd
Retornos:
404 Not found
Para especificar, todos os usuários que terão acesso ao objeto podem ser complicados e seguintes. É aqui que os grupos são úteis.
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "group-id-1" ]
}
}
} Como você pode adivinhar, esse objeto agora está acessível por usuários que possuem group-id-1 especificado em acl_groups no objeto do usuário.
Se user-id-1 e user-id-2 não estiverem no group-id-1 , esses usuários poderão ter acesso explícito desta maneira:
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" ]
}
}
} Se você instalou o mixin em seu modelo, mas não especifica $acl na criação de um novo objeto, a visibilidade dos objetos será pública, ex:
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship"
}retorna
{
"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
Em model-config.json add ../node_modules/loopback-object-acl para mixins
"_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"
]
} Defina ObjectAclController em qualquer modelo que você gostaria de proteger com a ACL em nível de objeto:
book . json
{
"name" : "Book" ,
"base" : "PersistedModel" ,
"idInjection" : true ,
"options" : {
"validateUpsert" : true
} ,
"mixins" : {
"ObjectAclController" : { }
}
. . .
} Este mixins espera um objeto currentUser no objeto options . Isso não é o comportamento do loopback v3.x padrão e deve ser implementado antes do uso.
A implementação pode ser encontrada aqui: http://loopback.io//doc/en/lb3/using-current-context.html#use-a-custom--strong-fase-fase
Este mixin é testado apenas com loopback v3.x e usando o mongodb como DataSource
Versão 2.0