Loopback offre un excellent ACL "au niveau de la classe" pour restreindre l'accès à un modèle entier ou à ses Mehods, mais n'a grandement pas la capacité de restreindre l'accès à des objets individuels. Ce projet essaie de résoudre ce problème, en définissant les ACL au niveau de l'objet sur chaque objet, et manipule la requête de Loopback pour uniquement les objets à retourner à laquelle l'utilisateur demande a accès.
Circleci:
Disons que nous voulons qu'un objet de livre soit uniquement lisible (jeu de mots) par 3 utilisateurs (ID: "AAA", ID: "BBB" et ID: "CCC"):
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Le mélange analysera l'objet à stocker comme à Mongo:
{
id : ObjectId ( "123" ) ,
title : "Clean Code" ,
subtitle : "A Handbook of Agile Software Craftsmanship" ,
r : {
u : [ "aaa" , "bbb" , "ccc" ]
g : [ ]
} ,
w : {
u : [ ] ,
g : [ ]
}
}Cet objet ne peut désormais être accessible que par un utilisateur avec un ID de "AAA", "BBB" ou "CCC" et personne d'autre. Lors de la récupération, le mixin analysera à nouveau l'acl de l'objet:
GET /api/books/123
authorization: accessToken-aaa
Renvoie:
{
"id" : "123"
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Alors que la demande sans autorisation mène à:
GET /api/books/123
authorization: accessToken-ddd
Renvoie:
404 Not found
Pour spécifier, chaque utilisateur qui aura accès à l'objet peut être lourd et chronométrant. C'est là que les groupes sont utiles.
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "group-id-1" ]
}
}
} Comme vous pourriez l'avoir deviné, cet objet est désormais accessible par des utilisateurs qui ont group-id-1 spécifié dans acl_groups sur l'objet utilisateur.
Si user-id-1 et user-id-2 ne sont pas dans group-id-1 ces utilisateurs peuvent avoir un accès explicite de cette façon:
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 vous avez installé le mixin sur votre modèle mais que vous ne spécifiez pas $acl sur la création d'un nouvel objet, la visibilité des objets sera publique, ex:
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship"
}rendements
{
"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
Dans model-config.json Add ../node_modules/loopback-object-acl aux 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"
]
} Définissez ObjectAclController sur le modèle que vous souhaitez protéger avec ACL au niveau de l'objet:
book . json
{
"name" : "Book" ,
"base" : "PersistedModel" ,
"idInjection" : true ,
"options" : {
"validateUpsert" : true
} ,
"mixins" : {
"ObjectAclController" : { }
}
. . .
} Ce mélange attend un objet currentUser sur l'objet options . Ce n'est pas un comportement V3.x en boucle par défaut et doit être implémenté avant l'utilisation.
La mise en œuvre peut être trouvée ici: http://loopback.io//doc/en/lb3/using-current-context.html#use-a-custom-strong-remoting-phase
Ce mixin n'est testé qu'avec Loopback V3.x et en utilisant MongoDB comme source de données
Version 2.0