Loopback memberikan ACL "tingkat kelas" yang hebat untuk membatasi akses ke seluruh model atau mehods-nya, tetapi sangat tidak memiliki kemampuan untuk mengembalikan akses ke objek individu. Proyek ini mencoba menyelesaikan ini, dengan mengatur ACL tingkat objek pada setiap objek, dan memanipulasi kueri Loopback untuk hanya mengembalikan objek yang diminta pengguna.
Circleci:
Katakanlah kita ingin objek-buku hanya dapat dibaca (pun intended) oleh 3 pengguna (id: "aaa", id: "bbb" dan id: "ccc"):
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Mixin akan mengurai objek yang akan disimpan seperti di Mongo:
{
id : ObjectId ( "123" ) ,
title : "Clean Code" ,
subtitle : "A Handbook of Agile Software Craftsmanship" ,
r : {
u : [ "aaa" , "bbb" , "ccc" ]
g : [ ]
} ,
w : {
u : [ ] ,
g : [ ]
}
}Objek ini sekarang hanya dapat diakses oleh pengguna dengan ID "AAA", "BBB" atau "CCC" dan tidak ada orang lain. Saat mengambil, mixin akan mengurai ACL objek kembali lagi:
GET /api/books/123
authorization: accessToken-aaa
kembali:
{
"id" : "123"
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"users" : [ "aaa" , "bbb" , "ccc" ]
}
}
}Sedangkan meminta tanpa izin mengarah pada:
GET /api/books/123
authorization: accessToken-ddd
kembali:
404 Not found
Untuk menentukan setiap pengguna yang akan memiliki akses ke objek dapat menjadi rumit dan mengkonsumsi waktu. Di sinilah kelompok berguna.
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship" ,
"_acl" : {
"r_perm" : {
"groups" : [ "group-id-1" ]
}
}
} Seperti yang mungkin Anda duga, objek ini sekarang dapat diakses oleh pengguna yang memiliki group-id-1 ditentukan dalam acl_groups pada objek pengguna.
Jika user-id-1 dan user-id-2 tidak ada di group-id-1 maka pengguna ini dapat memiliki akses eksplisit dengan cara ini:
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" ]
}
}
} Jika Anda telah menginstal mixin pada model Anda tetapi Anda tidak menentukan $acl pada pembuatan objek baru, visibilitas objek akan bersifat publik, mis.
POST /api/books
{
"title" : "Clean Code" ,
"subtitle" : "A Handbook of Agile Software Craftsmanship"
}kembali
{
"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
Dalam model-config.json Tambahkan ../node_modules/loopback-object-acl ke 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"
]
} Atur ObjectAclController pada model apa pun yang ingin Anda lindungi dengan ACL tingkat objek:
book . json
{
"name" : "Book" ,
"base" : "PersistedModel" ,
"idInjection" : true ,
"options" : {
"validateUpsert" : true
} ,
"mixins" : {
"ObjectAclController" : { }
}
. . .
} Mixins ini mengharapkan objek currentUser pada objek options . Ini bukan perilaku loopback v3.x default, dan harus diimplementasikan sebelum penggunaan.
Implementasi dapat ditemukan di sini: http://loopback.io//doc/en/lb3/using-current-context.html#use-a-custom-stong-remoting-phase
Mixin ini hanya diuji dengan loopback v3.x dan menggunakan mongoDB sebagai DataSource
Versi 2.0