Loopback proporciona una excelente ACL de "nivel de clase" para restringir el acceso a un modelo completo o a sus mehods, pero carece enormemente la capacidad de restriccionamiento de acceso a objetos individuales. Este proyecto intenta resolver esto, estableciendo ACL a nivel de objeto en cada objeto, y manipula la consulta de Loopback para devolver solo los objetos a los que el usuario solicitante tiene acceso.
Circleci:
Digamos que queremos que un objeto de libro solo sea legible (juego de palabras) por 3 usuarios (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" ]
}
}
}La mezcla analizará el objeto que se almacenará como en Mongo:
{
id : ObjectId ( "123" ) ,
title : "Clean Code" ,
subtitle : "A Handbook of Agile Software Craftsmanship" ,
r : {
u : [ "aaa" , "bbb" , "ccc" ]
g : [ ]
} ,
w : {
u : [ ] ,
g : [ ]
}
}Un usuario solo puede acceder a este objeto con una ID de "AAA", "BBB" o "CCC" y nadie más. Al recuperar, la mezcla analizará el ACL del objeto de nuevo:
GET /api/books/123
authorization: accessToken-aaa
Devoluciones:
{
"id" : "123"
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Mientras que solicitar sin permisos conduce a:
GET /api/books/123
authorization: accessToken-ddd
Devoluciones:
404 Not found
Para especificar, cada usuario que tendrá acceso al objeto puede ser engorroso y de tiempo de tiempo. Aquí es donde los grupos son útiles.
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "group-id-1" ]
}
}
} Como podría adivinar, este objeto ahora es accesible por los usuarios que tienen group-id-1 especificado en acl_groups en el objeto de usuario.
Si user-id-1 y user-id-2 no están en group-id-1 , estos usuarios pueden tener acceso explícito de esta manera:
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" ]
}
}
} Si ha instalado la mezcla en su modelo pero no especifica $acl en la creación de un nuevo objeto, la visibilidad de los objetos será pública, ex:
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship"
}devolución
{
"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
En model-config.json add ../node_modules/loopback-object-acl para mezclar
"_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"
]
} Establezca ObjectAclController en el modelo que desee proteger con el ACL a nivel de objeto:
book . json
{
"name" : "Book" ,
"base" : "PersistedModel" ,
"idInjection" : true ,
"options" : {
"validateUpsert" : true
} ,
"mixins" : {
"ObjectAclController" : { }
}
. . .
} Esta mezcla espera un objeto currentUser en el objeto options . Esto no es un comportamiento de bucleback v3.x predeterminado, y debe implementarse antes del uso.
La implementación se puede encontrar aquí: http://loopback.io//doc/en/lb3/using-current-context.html#use-a-customstrong-remoting- fase
Esta mezcla solo se prueba con loopback v3.x y usando MongoDB como plato de datos
Versión 2.0