Loopback bietet großartige ACLs auf Klassenebene, um den Zugriff auf ein ganzes Modell oder seine Mehods einzuschränken, aber es fehlt jedoch erheblich die Fähigkeit, den Zugriff auf einzelne Objekte einzuschränken. Dieses Projekt versucht, dies zu lösen, indem ACLs auf Objektebene auf jedem Objekt festgelegt werden und die Anfrage von Loopback manipuliert, um nur Objekte zurückzugeben, auf die der anfordernde Benutzer zugreifen kann.
Circleci:
Nehmen wir an, wir möchten, dass ein Buchobjekt nur von 3 Benutzern lesbar ist (Wortspiel beabsichtigt) (ID: "AAA", ID: "BBB" und ID: "CCC"):
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Der Mixin wird das Objekt analysieren, das wie in Mongo gespeichert werden soll:
{
id : ObjectId ( "123" ) ,
title : "Clean Code" ,
subtitle : "A Handbook of Agile Software Craftsmanship" ,
r : {
u : [ "aaa" , "bbb" , "ccc" ]
g : [ ]
} ,
w : {
u : [ ] ,
g : [ ]
}
}Dieses Objekt kann nun nur von einem Benutzer mit einer ID von "AAA", "BBB" oder "CCC" und niemand anderem zugegriffen werden. Beim Abrufen wird der Mixin das ACL des Objekts gleich wieder analysiert:
GET /api/books/123
authorization: accessToken-aaa
Rückgaben:
{
"id" : "123"
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Während das Anfragen ohne Berechtigungen zu:
GET /api/books/123
authorization: accessToken-ddd
Rückgaben:
404 Not found
Um jeden Benutzer, der Zugriff auf das Objekt hat, zu spezifizieren, kann umständlich und zeitlich festgelegt werden. Hier sind Gruppen nützlich.
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "group-id-1" ]
}
}
} Wie Sie vielleicht vermutet haben, ist dieses Objekt jetzt von Benutzern zugegriffen, die in acl_groups auf dem Benutzerobjekt group-id-1 angegeben haben.
Wenn user-id-1 und user-id-2 nicht in group-id-1 sind, können diese Benutzer auf diese Weise explizite Zugriff haben:
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" ]
}
}
} Wenn Sie das Mixin auf Ihrem Modell installiert haben, aber $acl bei der Erstellung eines neuen Objekts nicht angeben, ist die Sichtbarkeit der Objekte öffentlich, z. B.:
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship"
}zurück
{
"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
In model-config.json add ../node_modules/loopback-object-acl zu 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"
]
} Setzen Sie ObjectAclController auf welchem Modell, das Sie mit ACL auf Objektebene schützen möchten:
book . json
{
"name" : "Book" ,
"base" : "PersistedModel" ,
"idInjection" : true ,
"options" : {
"validateUpsert" : true
} ,
"mixins" : {
"ObjectAclController" : { }
}
. . .
} Dieser Mixins erwartet ein currentUser Objekt im options . Dies ist kein Standard -Loopback V3.x -Verhalten und muss vor der Verwendung implementiert werden.
Implementierung kann hier gefunden werden: http://loopback.io//doc/en/lb3/using-current-context.html#use-a-custom-strong-remoting-phase
Dieser Mixin wird nur mit Loopback V3.x getestet und mit MongoDB als DataSource verwendet
Version 2.0